協(xié)會(huì)網(wǎng)站制作百度網(wǎng)盤app官方下載
目錄
一、函數(shù)
1、函數(shù)的基本格式
2、查看函數(shù)列表
3、刪除函數(shù)
4、函數(shù)的傳參數(shù)
5、函數(shù)返回值
實(shí)驗(yàn):
1.判斷輸入的ip地址正確與否
2. 判斷是否為管理員用戶登錄
6、函數(shù)變量的作用范圍
7、函數(shù)遞歸(重要、難點(diǎn))
實(shí)驗(yàn):
遞歸遍歷目錄
?編輯一鍵安裝nginx?
階乘
1.用for循環(huán)求階乘
2.用函數(shù)求階乘?編輯
附加:sed
二、數(shù)組
1、數(shù)組介紹
2、引言
3、shell數(shù)組的定義
4、定義數(shù)組格式
方法一:
方法二:
方法三:
實(shí)驗(yàn):
?簡(jiǎn)單隨機(jī)點(diǎn)名
方法一:
方法二:
?5、數(shù)組索引
6、數(shù)組定義方法
實(shí)驗(yàn):取最大值
7、冒泡排序法:
舉例:
一、函數(shù)
- 將命令序列按格式寫在一起
- 可以方便重復(fù)使用命令序列
- 函數(shù)也是一種腳本的別名
使用函數(shù)
1、先進(jìn)性定義
2、再調(diào)用
1、函數(shù)的基本格式
[function] 函數(shù)名(){命令序列
[return x] #使用return或exit可以顯示的結(jié)束函數(shù)
}或者
-------------------------------第二種使用較多---------------------------------------------------#也可以省略掉[function],它表示該函數(shù)的功能函數(shù)名() { #函數(shù)名后面()是沒有內(nèi)容的命令序列 #我們執(zhí)行的命令內(nèi)容放在{}里面
}----------------------------------------------------------------------------------
[function] 函數(shù)名 {命令序列}
- 函數(shù)定義完之后并不會(huì)自動(dòng)執(zhí)行,需要調(diào)用才行
- 好處在于可以寫一段功能代碼作為函數(shù),有需要就直接調(diào)用定義的時(shí)候哪怕出現(xiàn)語法錯(cuò)誤也沒關(guān)系,不調(diào)用就不會(huì)報(bào)錯(cuò)
- 當(dāng)然我們寫函數(shù)最終目的還是為了調(diào)用,為了實(shí)現(xiàn)某個(gè)功能塊。
舉例:
#!/bin/bash
h () {
echo "hello"
}niao () {
echo `h` `w`
}w () {
echo "world"
}nihao
?
最簡(jiǎn)單的例子
vim func.sh#!/bin/bashhaha () {echo "hello"}haha
#這個(gè)是調(diào)用hellobash func.sh
123
如果在其他文件中調(diào)用這個(gè)文件
添加顏色
2、查看函數(shù)列表
declare -F ##查看當(dāng)前已定義的函數(shù)名declare -f ##查看當(dāng)前已定義的函數(shù)定義declare -f func_name ##查看指定當(dāng)前已定義的函數(shù)名declare -F func_name ##查看當(dāng)前已定義的函數(shù)名定義
3、刪除函數(shù)
刪除函數(shù): ? unset func_name
[root@localhost data]#func1 () { hostname;hostname -I; }
[root@localhost data]#func1
localhost.localdomain
20.0.0.100 192.168.122.1
[root@localhost data]#unset func1
[root@localhost data]#func1
bash: func1: 未找到命令...
4、函數(shù)的傳參數(shù)
#!/bin/bashh () {
echo "第一個(gè)參數(shù)是:$1 $2 $3"}h $1 $2 $3 ##調(diào)用
調(diào)換位置
#!/bin/bashh () {
echo "第一個(gè)參數(shù)是:$1 $2 $3"}h $2 $1 $3 ##調(diào)用
5、函數(shù)返回值
實(shí)驗(yàn):
1.判斷輸入的ip地址正確與否
使用原則:
1、函數(shù)一結(jié)束就取返回值,因?yàn)??變量只返回執(zhí)行的最后一條命令的退出狀態(tài)碼
2、退出狀態(tài)碼必須是0~255,超出時(shí)值將為除以256取余return ###只能用在函數(shù)中
###return 從函數(shù)中返回,用最后狀態(tài)命令決定返回值
###return 0 無錯(cuò)誤返回
###return 1 有錯(cuò)誤返回exit 100 ##exit退出整個(gè)腳本
?
2. 判斷是否為管理員用戶登錄
6、函數(shù)變量的作用范圍
函數(shù)在Shell腳本中僅在當(dāng)前Shell環(huán)境中有效
Shell腳本中變量默認(rèn)全局有效
將變量限定在函數(shù)內(nèi)部使用local命令
7、函數(shù)遞歸(重要、難點(diǎn))
調(diào)用自己本身的函數(shù)
可以寫病毒
[root@localhost ~]#func () { echo $i;echo "run fast";let i++; func; }func
for炸彈
:(){ :|:& };: //:就是一個(gè)字符 可以寫成單詞
bomb() { bomb | bomb & }; bomb
執(zhí)行bomb以后會(huì)死機(jī),除非重啟,在沒有其他辦法。
實(shí)驗(yàn):
遞歸遍歷目錄
一鍵安裝nginx?
階乘
0和1的階乘都為1
自然數(shù)n的階乘寫作n!
1.用for循環(huán)求階乘
2.用函數(shù)求階乘
附加:sed
sed? -i? ?“s/舊/新/g”? ?文件名 ### -i 選項(xiàng)是真的改#sed -i "s/root/admin/g" passwd
#當(dāng)面文件夾下的passwd里的root改為admin
sed -i.bak "s/admin/root/g" passwd ### -i.bak 是做備份,.bak只是后綴名,可以任意寫
sed "2a/hahahahaha" passwd ### a是插入的意思,2a是在第二行后面插入
sed
- i? ? :在前面插
- a? ?:在后面插
- c? ?:整行替換
二、數(shù)組
1、數(shù)組介紹
數(shù)組和變量:
- 數(shù)組:儲(chǔ)存多個(gè)元素的連續(xù)的內(nèi)存空間,相當(dāng)于多個(gè)變量的集合
- 變量:存儲(chǔ)單個(gè)元素的內(nèi)存空間
2、引言
將全班學(xué)生定義成一個(gè)變量,無法使用普通變量。
-
普通數(shù)組
-
關(guān)聯(lián)數(shù)組
變量和數(shù)組
-
變量:存儲(chǔ)單個(gè)元素的內(nèi)存空間
-
數(shù)組:存儲(chǔ)多個(gè)元素的連續(xù)的內(nèi)存空間,相當(dāng)于多個(gè)變量的集合
數(shù)組名和索引
-
索引的編號(hào)從0開始,屬于數(shù)值索引
-
索引可支持使用自定義的格式,而不僅是數(shù)值格式,即為關(guān)聯(lián)索引,bash 4.0版本之后開始支持
-
bash的數(shù)組支持稀疏格式(索引不連續(xù))
3、shell數(shù)組的定義
數(shù)組中可以存放多個(gè)值,Bash Shell 只支持一維數(shù)組(不支持多維數(shù)組)
數(shù)組元素的下標(biāo)由 0 開始
Shell 數(shù)組用括號(hào)來表示,元素用"空格"符號(hào)分割開
在shell語句中,使用、遍歷數(shù)組的時(shí)候,數(shù)組格式要寫成 ${arr[@]} 或 ${arr[*]}
4、定義數(shù)組格式
方法一:
數(shù)組名=(value1 value2 ... valuen)
[root@localhost lyh]#a=(1 2 3 4 5)
[root@localhost lyh]#echo ${a[@]}
1 2 3 4 5
[root@localhost lyh]#echo ${a[*]}
1 2 3 4 5
方法二:
數(shù)組名=([0]=value0 [1]=value0 [2]=value0 ...)
[root@localhost lyh]#b=([0]=1 [1]=2 [2]=3 [3]=4 [4]=5)
[root@localhost lyh]#echo ${b[@]}
1 2 3 4 5
方法三:
數(shù)組名[0]="value"
數(shù)組名[1]="value"
數(shù)組名[2]="value"[root@localhost lyh]#c[0]=1
[root@localhost lyh]#c[1]=2
[root@localhost lyh]#c[2]=3
[root@localhost lyh]#c[3]=4
[root@localhost lyh]#echo ${c[@]}
1 2 3 4
實(shí)驗(yàn):
?簡(jiǎn)單隨機(jī)點(diǎn)名
方法一:
方法二:
?5、數(shù)組索引
數(shù)組名和索引
- 索引的編號(hào)從0開始,屬于數(shù)值索引
- 索引可支持使用自定義的格式,而不僅是數(shù)值格式,即為關(guān)聯(lián)索引,bash? 4.0版本之后開始支持
- bash的數(shù)組支持稀疏格式(索引不連續(xù))
索引分為兩種:普通索引和關(guān)聯(lián)索引
普通索引:上面解釋了
關(guān)聯(lián)索引:①下表可以是文字:稱為關(guān)聯(lián)索引? 鍵值對(duì)的關(guān)系
? ? ? ? ? ? ? ? ? ②下表可以不連續(xù),稱為稀疏格式
?注意:關(guān)聯(lián)數(shù)組和普通數(shù)組都要先聲明,普通可以聲明也可以不用聲明
? ? ? ? ? ? 但是關(guān)聯(lián)數(shù)組必須要先聲明
定義關(guān)聯(lián)數(shù)組一定要聲明,不聲明就沒有效果
[root@localhost data]#declare -A 數(shù)組名? ? ??-A 聲明關(guān)聯(lián)數(shù)組,
[root@localhost data]#declare -a? 數(shù)組名?? ? -a? 聲明普通數(shù)組,?不是變量是數(shù)組
只能把這個(gè)刪了重新聲明,不聲明就會(huì)混亂
6、數(shù)組定義方法
方法一(一次賦值全部元素):
數(shù)組名=(value0 valuel value2 ...)
a=(10 20 30 40 50)方法二(只賦值特定元素):
數(shù)組名=([0]=value[1]=value[2]=value ··)
b=([0]=10[1]=20[21=30)方法三:
列表名="value0 valuel value2..."
數(shù)組名=(S列表名)
[root@localhost data]#b="12345 6"
[root@localhost data]#c=$b
[root@localhost data]#echo ${c[*]}
123456方法四(一次只賦值一個(gè)元素): 追加 修改
數(shù)組名[0]="value"
數(shù)組名[1]="value"
數(shù)組名[2]="value"方法五:read-a 交互式
[root@localhost datal#touch{1..10}.txt
[root@localhost datal#file=(*.txt) //當(dāng)前文件夾下的,所有txt結(jié)尾的文件
[root@localhost datal#echo $file
10.txt
實(shí)驗(yàn):
取最大值
取最小值:?
隨機(jī)數(shù)
?
7、冒泡排序法:
數(shù)組排序算法:冒泡排序
類似氣泡上涌的動(dòng)作,會(huì)將數(shù)據(jù)在數(shù)組中從小到大或者從大到小不斷的向前移動(dòng)。
基本思想:
冒泡排序的基本思想是對(duì)比相鄰的兩個(gè)元素值,如果滿足條件就交換元素值,把較小的元素移動(dòng)到數(shù)組前面,把大的元素移動(dòng)到數(shù)組后面(也就是交換兩個(gè)元素的位置),這樣較小的元素就像氣泡一樣從底部上升到頂部。
算法思路:
冒泡算法由雙層循環(huán)實(shí)現(xiàn),其中外部循環(huán)用于控制排序輪數(shù),一般為要排序的數(shù)組長(zhǎng)度減1次,因?yàn)樽詈笠淮窝h(huán)只剩下一個(gè)數(shù)組元素,不需要對(duì)比,同時(shí)數(shù)組已經(jīng)完成排序了。而內(nèi)部循環(huán)主要用于對(duì)比數(shù)組中每個(gè)相鄰元素的大小,以確定是否交換位置,對(duì)比和交換次數(shù)隨排序輪數(shù)而減少。
score=(77 13 91 56 88)兩兩對(duì)比,第1個(gè)和第2個(gè)比,小的值到前面,大的值到后面。
以此類推。第2個(gè)和第3個(gè)比,第3個(gè)和第4個(gè)比,第4個(gè)和第5個(gè)比------------第一輪------------
77 13 91 56 88 第一次對(duì)比 數(shù)組長(zhǎng)度-1 第一輪比較往后值, 最大值為91
13 77 91 56 88 第二次對(duì)比
13 77 91 56 88 第三次對(duì)比
13 77 56 91 88 第四次對(duì)比
13 77 56 88 91
------------第二輪------------
13 77 56 88 91 第一次對(duì)比 數(shù)組長(zhǎng)度-1第二輪比較往后,第二大的數(shù)字88
13 77 56 88 91 第二次對(duì)比
13 56 77 88 91 第三次對(duì)比
13 56 77 88 91
------------第三輪-----------
13 56 77 88 91 第一次對(duì)比 數(shù)組長(zhǎng)度-1第三輪比較往后,第三大的數(shù)字77
13 56 77 88 91 第二次對(duì)比
13 56 77 88 91
------------第四輪-----------
13 56 77 88 91 第一次對(duì)比 數(shù)組長(zhǎng)度-1第四輪比較往后,第四大的數(shù)字56
13 56 77 88 91
舉例:
#!/bin/bash
array=(98 76 24 100 35 3)
echo "old_array:${array[*]}"
lt=${#array[*]}
#定義比較輪數(shù),比較輪數(shù)為數(shù)組長(zhǎng)度-1,從1開始
for ((i=1;i<$lt;i++))
do#確定比較元素的位置,比較相鄰兩個(gè)元素,較大的數(shù)往后放,比較次數(shù)隨比較輪數(shù)而
減少for ((j=0;j<$lt-i;j++))do#定義第一個(gè)元素的值first=${array[$j]}#定義第二個(gè)元素的值k=$[$j+1]second=${array[$k]}#如果第一個(gè)元素比第二個(gè)元素大,就互換if [ $first -gt $second ];then#把第一個(gè)元素的值保存到臨時(shí)變量中temp=$first#把第二個(gè)元素值賦給第一個(gè)元素array[$j]=$second#把臨時(shí)變量賦給第二個(gè)元素array[$k]=$tempfidone
done
echo "new_array:${array[@]}"
二