Shell 指令碼(shell script)學習
test.sh
#!/bin/bash
echo "Hello World !"
執行方法
1、作為可執行程式
將上面的程式碼儲存為 test.sh,並 cd 到相應目錄:
chmod + x 目錄
chmod +x ./test.sh #使指令碼具有執行許可權
./test.sh #執行指令碼
2、作為直譯器引數
這種執行方式是,直接執行直譯器,其引數就是 shell 指令碼的檔名,如:
/bin/sh 目錄
/bin/sh test.sh
變數
使用變數
使用一個定義過的變數,只要在變數名前面加美元符號即可,如:
your_name="qinjx" echo $your_name echo ${your_name}
只讀變數
使用 readonly 命令可以將變數定義為只讀變數,只讀變數的值不能被改變。
下面的例子嘗試更改只讀變數,結果報錯:
#!/bin/bash myUrl="http://www.google.com" readonly myUrl myUrl="http://www.runoob.com"
執行指令碼,結果如下:
/bin/sh: NAME: This variable is read only.
刪除變數
使用 unset 命令可以刪除變數。語法:
unset variable_name
變數被刪除後不能再次使用。unset 命令不能刪除只讀變數。
例項
#!/bin/sh myUrl="http://www.runoob.com" unset myUrl echo $myUrl
字串
字串是shell程式設計中最常用最有用的資料型別(除了數字和字串,也沒啥其它型別好用了),字串可以用單引號,也可以用雙引號,也可以不用引號。單雙引號的區別跟PHP類似。
單引號
str='this is a string'
單引號字串的限制:
- 單引號裡的任何字元都會原樣輸出,單引號字串中的變數是無效的;
- 單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符後也不行),但可成對出現,作為字串拼接使用。
雙引號
your_name='runoob' str="Hello, I know you are \"$your_name\"! \n" echo $strHello, I know you are "runoob"!
輸出結果為:
雙引號的優點:
- 雙引號裡可以有變數
- 雙引號裡可以出現轉義字元
拼接字串
your_name="runoob" # 使用雙引號拼接 greeting="hello, "$your_name" !" greeting_1="hello, ${your_name} !" echo $greeting $greeting_1 # 使用單引號拼接 greeting_2='hello, '$your_name' !' greeting_3='hello, ${your_name} !' echo $greeting_2 $greeting_3
輸出結果為:
hello, runoob ! hello, runoob ! hello, runoob ! hello, ${your_name} !
獲取字串長度
string="abcd" echo ${#string} #輸出 4
提取子字串
以下例項從字串第 2 個字元開始擷取 4 個字元:
string="runoob is a great site" echo ${string:1:4} # 輸出 unoo
查詢子字串
查詢字元 i 或 o 的位置(哪個字母先出現就計算哪個):
string="runoob is a great site" echo `expr index "$string" io` # 輸出 4
注意: 以上指令碼中 ` 是反引號,而不是單引號 ',不要看錯了哦。
Shell 陣列
bash支援一維陣列(不支援多維陣列),並且沒有限定陣列的大小。
類似於 C 語言,陣列元素的下標由 0 開始編號。獲取陣列中的元素要利用下標,下標可以是整數或算術表示式,其值應大於或等於 0。
定義陣列
在 Shell 中,用括號來表示陣列,陣列元素用"空格"符號分割開。定義陣列的一般形式為:
陣列名=(值1 值2 ... 值n)
例如:
array_name=(value0 value1 value2 value3)
或者
array_name=( value0 value1 value2 value3 )
還可以單獨定義陣列的各個分量:
array_name[0]=value0 array_name[1]=value1 array_name[n]=valuen
可以不使用連續的下標,而且下標的範圍沒有限制。
讀取陣列
讀取陣列元素值的一般格式是:
${陣列名[下標]}
例如:
valuen=${array_name[n]}
使用 @ 符號可以獲取陣列中的所有元素,例如:
echo ${array_name[@]}
獲取陣列的長度
獲取陣列長度的方法與獲取字串長度的方法相同,例如:
# 取得陣列元素的個數 length=${#array_name[@]} # 或者 length=${#array_name[*]} # 取得陣列單個元素的長度 lengthn=${#array_name[n]}
Shell 註釋
以 # 開頭的行就是註釋,會被直譯器忽略。
通過每一行加一個 # 號設定多行註釋,像這樣:
# 這是一個註釋
如果在開發過程中,遇到大段的程式碼需要臨時註釋起來,過一會兒又取消註釋,怎麼辦呢?
每一行加個#符號太費力了,可以把這一段要註釋的程式碼用一對花括號括起來,定義成一個函式,沒有地方呼叫這個函式,這塊程式碼就不會執行,達到了和註釋一樣的效果。
多行註釋
多行註釋還可以使用以下格式:
:<<EOF 註釋內容... 註釋內容... 註釋內容... EOF
EOF 也可以使用其他符號:
:<<' 註釋內容... 註釋內容... 註釋內容... ' :<<! 註釋內容... 註釋內容... 註釋內容... !
傳遞引數
echo "執行的檔名:$0"; echo "第一個引數為:$1";
基本運算子
原生bash不支援簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用
echo `expr 2 + 2`
******(注意使用的是反引號 ` 而不是單引號 ')
echo `expr $1 + $2`
關係運算符
關係運算符只支援數字,不支援字串,除非字串的值是數字。
下表列出了常用的關係運算符,假定變數 a 為 10,變數 b 為 20:
運算子 | 說明 | 舉例 |
---|---|---|
-eq | 檢測兩個數是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 檢測兩個數是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 檢測左邊的數是否大於右邊的,如果是,則返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 檢測左邊的數是否小於右邊的,如果是,則返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 檢測左邊的數是否大於等於右邊的,如果是,則返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 檢測左邊的數是否小於等於右邊的,如果是,則返回 true。 | [ $a -le $b ] 返回 true。 |
布林運算子
下表列出了常用的布林運算子,假定變數 a 為 10,變數 b 為 20:
運算子 | 說明 | 舉例 |
---|---|---|
! | 非運算,表示式為 true 則返回 false,否則返回 true。 | [ ! false ] 返回 true。 |
-o | 或運算,有一個表示式為 true 則返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 與運算,兩個表示式都為 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
邏輯運算子
以下介紹 Shell 的邏輯運算子,假定變數 a 為 10,變數 b 為 20:
運算子 | 說明 | 舉例 |
---|---|---|
&& | 邏輯的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 邏輯的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
字串運算子
下表列出了常用的字串運算子,假定變數 a 為 "abc",變數 b 為 "efg":
運算子 | 說明 | 舉例 |
---|---|---|
= | 檢測兩個字串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 檢測兩個字串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 檢測字串長度是否為0,為0返回 true。 | [ -z $a ] 返回 false。 |
-n | 檢測字串長度是否為0,不為0返回 true。 | [ -n "$a" ] 返回 true。 |
str | 檢測字串是否為空,不為空返回 true。 | [ $a ] 返回 true。 |
echo命令
1.顯示普通字串:
echo "It is a test"
這裡的雙引號完全可以省略,以下命令與上面例項效果一致:
echo It is a test
2.顯示轉義字元
echo "\"It is a test\""
結果將是:
"It is a test"
同樣,雙引號也可以省略
3.顯示變數
read 命令從標準輸入中讀取一行,並把輸入行的每個欄位的值指定給 shell 變數
#!/bin/sh read name echo "$name It is a test"
4.顯示換行
echo -e "OK! \n" # -e 開啟轉義 echo "It is a test"
6.顯示結果定向至檔案
#!/bin/sh echo "It is a test" > cjb.txt
7.原樣輸出字串,不進行轉義或取變數(用單引號)
echo '$name\"'
8.顯示命令執行結果
echo `date`
printf 命令
跟c語言類似
printf format-string [arguments...]
引數說明:
- format-string: 為格式控制字串
- arguments: 為引數列表。
判斷
#!/bin/sh a=10 b=20 if [$a>@b] then echo "a>b" else echo "a<b" fi
如果else分支沒有語句執行,就不要寫這個else。
for 迴圈
for loop in 1 2 3 4 5 do echo "The value is: $loop" done
#!/bin/bash for((i=1;i<=10;i++)); do echo $i; done
錯誤提示:
解決方法:
1、將預設shell更改為bash。(bash支援C語言格式的for迴圈)
sudo dpkg-reconfigure dash
2. 在選擇項中選No
Shell 函式
#!/bin/bash
demoFun(){ echo "這是我的第$1個 shell 函式!" echo "這是我的第$2個 shell 函式!" } echo "-----函式開始執行-----" demoFun $1 $2 echo "-----函式執行完畢-----"