shell學習總結-4

秦無殤發表於2019-04-04

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、重定向

 重定向分為輸入重定向和輸出重定向向兩種。重定向就是改變標準輸入和輸出的方向。標準的輸入方向為從鍵盤到程式,標準的輸出方向是從程式到螢幕。

為了區別檔案,給每個檔案分配一個整數,這個就是檔案描述符。

  1. 標準輸入的檔名為stdin,檔案描述符為0
  2. 標準輸出的檔名為stdout,檔案描述符為1
  3. 標準錯誤輸出檔名為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。