1、shell模組
shell指令碼中可以載入配置檔案或呼叫已經完成函式或指令碼。
a、載入配置檔案
新建配置檔案config,插入以下程式碼:
1 reboot_mode=True
在同一路徑下,新建檔案module.sh,插入以下程式碼:
1 #!/bin/bash 2 #可以簡寫為:. config 3 source config 4 echo "reboot mode is: ${reboot_mode}"
輸出:
1 reboot mode is: True
b、使用其它檔案中定義的函式
新建檔案add.sh,插入以下程式碼:
1 #!/bin/bash 2 function add(){ 3 x=$1 4 y=$2 5 echo "`expr ${x} + ${y}`" 6 }
在同一路徑下module.sh中,插入以下程式碼:
1 #!/bin/bash 2 #可以簡寫為:. config 3 source config 4 echo "reboot mode is: ${reboot_mode}" 5 6 #載入add模組 7 . add.sh 8 echo " 1 + 2 result is: $(add 1 2)"
輸出:
1 reboot mode is: True 2 1 + 2 result is: 3
2、區域性變數和全域性變數
1 #區域性變數只能在函式中定義,不加local即為全域性變數,語法如下: 2 local var_name=val
示例:
1 function say_hi(){ 2 local str1="hi" 3 name=$1 4 echo "${str1},${name},Nice to meet you!" 5 } 6 say_hi "Vicent" 7 8 #在函式外列印name和str1 9 #str1為區域性變數,無法在函式外引用 10 echo "val of str1 is: ${str1}" 11 #name為全部變數,輸出為Vicent 12 echo "val of name is: ${name}"
輸出:
1 hi,Vicent,Nice to meet you! 2 val of str1 is: 3 val of name is: Vicent
3、重定向
重定向分為輸入重定向和輸出重定向向兩種。重定向就是改變標準輸入和輸出的方向。標準的輸入方向為從鍵盤到程式,標準的輸出方向是從程式到螢幕。
為了區別檔案,給每個檔案分配一個整數,這個就是檔案描述符。
- 標準輸入的檔名為stdin,檔案描述符為0
- 標準輸出的檔名為stdout,檔案描述符為1
- 標準錯誤輸出檔名為stderr,檔案描述符為2
輸出重定向是值輸出不再是螢幕,一般是檔案,這樣可以方便儲存與檢視。
示例1:
1 #命令>檔案,以覆蓋的方式把命令的正確結果輸出到檔案中 2 ls -all > a.txt 3 cat a.txt
輸出1:
1 總用量 20 2 drwxr-xr-x 2 stephen stephen 4096 4月 4 18:54 . 3 drwxr-xr-x 61 stephen stephen 4096 4月 4 18:15 .. 4 -rw-rw-r-- 1 stephen stephen 69 4月 4 18:25 add.sh 5 -rw-r--r-- 1 stephen stephen 0 4月 4 18:54 a.txt 6 -rw-r--r-- 1 stephen stephen 17 4月 4 18:15 config 7 -rw-rw-r-- 1 stephen stephen 557 4月 4 18:54 module.sh
示例2:
1 #ll命令不存在,所以會報錯。以覆蓋的方式把標準輸出和標準錯誤輸出重定向到檔案b.txt中 2 date;ll > b.txt 2>&1 3 cat b.txt
輸出2:
1 2019年 04月 04日 星期四 18:59:52 CST 2 module.sh: 行 24: ll: 未找到命令
示例3:
1 #ll命令不存在,所以會報錯 2 #ll命令不存在,所以會報錯。以追加的方式把標準輸出和標準錯誤輸出重定向到檔案b.txt中 3 date > b.txt 4 date;ll >> b.txt 2>&1 5 cat b.txt
輸出3:
1 2019年 04月 04日 星期四 19:04:00 CST 2 2019年 04月 04日 星期四 19:04:00 CST 3 module.sh: 行 27: ll: 未找到命令
4、宣告變數型別
1 #用來設定變數的屬性,語法如下: 2 declare [+/-] [aAfFgilprtux] [name=val] 3 #+設定屬性,取消屬性 ,i表示整數 r表示只讀變數等
示例1:
1 declare -i m=1 2 echo ${m}
輸出1:
1 1
示例2:
1 declare -i n="Hello" 2 echo ${b}
輸出2:
1 0
5、read和位置引數
示例1:
1 #用來從標準輸出中讀取資料並賦值 2 #示例 3 read -t 20 -sp "Please input your password : " passwd 4 if [ ${passwd} = "123456" ] ;then 5 echo "login sucess." 6 else 7 echo "login fail." 8 fi
- -t, 超時時間,單位為s
- -s,靜默模式,螢幕上不顯示輸入
- -p,顯示提示資訊
輸出1:
1 Please input your password : login sucess.
位置引數
示例2:
插入以下程式碼並儲存為module.sh
1 echo "First arg is: $1" 2 echo "Second arge is :$2" 3 echo "All args is : $*" 4 echo "Total args num is:$#
輸出2:
1 First arg is: Hello 2 Second arge is :World 3 All args is : Hello World 4 Total args num is:2
6、shell除錯
使用-x引數除錯shell指令碼,通過-x可以看到執行過程中變數取值與執行情況。
示例1:
以下程式碼儲存到test.sh中
1 #!/bin/bash 2 function say_hi(){ 3 local str1="hi" 4 declare -i name
name=$1 5 echo "${str1},${name},Nice to meet you!" 6 } 7 say_hi "Vicent"
除錯指令碼test.sh
1 /bin/bash -x test.sh
預期輸出為:
1 hi,Vicent,Nice to meet you!
實際輸出1:
1 + say_hi Vicent 123 2 + local str1=hi 3 + declare -i name=Vicent 4 + echo 'hi,0,Nice to meet you!' 5 hi,0,Nice to meet you
通過 -x列印出來的資訊可以看到name變數為強制宣告為整數,所以把字串裝換成了數字0。