2021-05-12 14:32:11
Linux基礎之-shell script(變數,運算子,流程控制,函數)
一、shell script
Shell 指令碼(shell script),是一種為shell編寫的指令碼程式。業界所說的shell通常都是指shell指令碼,但讀者朋友要知道,shell和shell script是兩個不同的概念。
1. 新建一個shell指令碼hw.sh
擴充套件名並不影響指令碼執行,只是方便表示檔案型別
"#!" 是一個約定的標記,它告訴系統這個指令碼需要什麼直譯器來執行,即使用哪一種Shell。
2. shell指令碼的執行
a:作為可執行程式 ./hw.sh
注意,一定要寫成./hw.sh,而不是hw.sh,執行其它二進位制的程式也一樣,直接寫hw.sh,linux系統會去PATH裡尋找有沒有叫hw.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH裡,你的當前目錄通常不在PATH裡,所以寫成hw.sh是會找不到命令的,要用./hw.sh告訴系統說,就在當前目錄找。
b: 作為直譯器引數,這種方式執行的指令碼,不需要在第一行指定直譯器資訊,寫了也沒用。
直接執行直譯器,其引數就是shell指令碼的檔名,如:
/bin/sh hw.sh
/bin/php hw.php
3. #
以"#"開頭的行就是注釋,會被直譯器忽略。
sh裡沒有多行注釋,只能每一行加一個#號。
如果在開發過程中,遇到大段的程式碼需要臨時注釋起來,過一會兒又取消註釋,怎麼辦呢?
每一行加個#符號太費力了,可以把這一段要注釋的程式碼用一對花括號括起來,定義成一個函數,沒有地方呼叫這個函數,這塊程式碼就不會執行,達到了和注釋一樣的效果。
二、shell變數
1. 變數的命名規則
變數名和等號之間不能有空格,這可能和你熟悉的所有程式語言都不一樣。同時,變數名的命名須遵循如下規則:
- 首個字元必須為字母(a-z,A-Z)或者下劃線(_)。
- 中間不能有空格,可以使用下劃線(_)。
- 不能使用標點符號。
- 不能使用bash裡的關鍵字(可用help命令檢視保留關鍵字)。
- 對於檔案最好加上擴充套件名
2. 變數賦值
a. 變數名=值,如,x=3,name=“jack”
b. 除了顯式地直接賦值,還可以用語句給變數賦值,如:for file in `ls /etc`,將 /etc 下目錄的檔名迴圈出來。
3. 使用變數
a. 使用一個定義過的變數,只要在變數名前面加美元符號即可,如:echo $x;echo $name;echo ${name};
b. 變數名外面的花括號是可選的,加不加都行,加花括號是為了幫助直譯器識別變數的邊界,比如下面這種情況:
for skill in Ada Coffe Action Java do
echo "I am good at ${skill}Script"
done
如果不給skill變數加花括號,寫成echo "I am good at $skillScript",直譯器就會把$skillScript當成一個變數(其值為空),程式碼執行結果就不是我們期望的樣子了。
c. 已定義的變數,可以被重新定義
三、shell字串
字串是shell程式設計中最常用最有用的資料型別(除了數位和字串,也沒啥其它型別好用了),字串可以用單引號,也可以用雙引號,也可以不用引號。單雙引號的區別跟PHP類似。
1. 單引號
str='this is a string'
單引號字串的限制:
- 單引號裡的任何字元都會原樣輸出,單引號字串中的變數是無效的;
- 單引號字串中不能出現單引號(對單引號使用跳脫符後也不行)。
2. 雙引號
your_name='qinjx' str="Hello, I know your are "$your_name"! n"
雙引號的優點:
- 雙引號裡可以有變數
- 雙引號裡可以出現跳脫字元
3. 拼接字串
your_name="qinjx" greeting="hello, "$your_name" !" greeting_1="hello, ${your_name} !" echo $greeting $greeting_1
4. 獲取字串長度
string="abcd" echo ${#string} #輸出 4
5. 提取子字串
string="alibaba is a great company" echo ${string:1:4} #輸出liba
6. 查詢子字串
string="alibaba is a great company" echo `expr index "$string" is`
注意: 以上指令碼中 "`" 是反引號,而不是單引號 "'",不要看錯了哦。
四、shell傳遞引數
我們可以在執行 Shell 指令碼時,向指令碼傳遞引數,指令碼內獲取引數的格式為:$n。n 代表一個數位,1 為執行指令碼的第一個引數,2 為執行指令碼的第二個引數,以此類推……
以下範例我們向指令碼傳遞三個引數,並分別輸出,其中 $0 為執行的檔名:
#!/bin/bash # author:W3Cschool教學 # url:www.w3cschool.cn echo "Shell 傳遞引數範例!"; echo "執行的檔名:$0"; echo "第一個引數為:$1"; echo "第二個引數為:$2"; echo "第三個引數為:$3";
為指令碼設定可執行許可權,並執行指令碼,輸出結果如下所示:
$ chmod +x test.sh $ ./test.sh 1 2 3 Shell 傳遞引數範例! 執行的檔名:test.sh 第一個引數為:1 第二個引數為:2 第三個引數為:3
另外,還有幾個特殊字元用來處理引數:
引數處理 | 說明 |
---|---|
$# | 傳遞到指令碼的引數個數 |
$* | 以一個單字串顯示所有向指令碼傳遞的引數。 如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有引數。 |
$$ | 指令碼執行的當前進程ID號 |
$! | 後台執行的最後一個進程的ID號 |
$@ | 與$*相同,但是使用時加引號,並在引號中返回每個引數。 如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有引數。 |
$- | 顯示Shell使用的當前選項,與set命令功能相同。 |
$? | 顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。 |
五、shell運算子
Shell 和其他程式語言一樣,支援多種運算子,包括:
- 算術運算子
- 關係運算子
- 布林運算子
- 字串運算子
- 檔案測試運算子
1. 算術運算子
下表列出了常用的算術運算子,假定變數 a 為 10,變數 b 為 20:
運算子 | 說明 | 舉例 |
---|---|---|
+ | 加法 | `expr $a + $b` 結果為 30。 |
- | 減法 | `expr $a - $b` 結果為 10。 |
* | 乘法 | `expr $a * $b` 結果為 200。 |
/ | 除法 | `expr $b / $a` 結果為 2。 |
% | 取餘 | `expr $b % $a` 結果為 0。 |
= | 賦值 | a=$b 將把變數 b 的值賦給 a。 |
== | 相等。用於比較兩個數位,相同則返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用於比較兩個數位,不相同則返回 true。 | [ $a != $b ] 返回 true。 |
注意:條件表示式要放在方括號之間,並且要有空格,例如: [$a==$b] 是錯誤的,必須寫成 [ $a == $b ]。
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。 |
3. 布林運算子
下表列出了常用的布林運算子,假定變數 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。 |
4. 邏輯運算子
以下介紹 Shell 的邏輯運算子,假定變數 a 為 10,變數 b 為 20:
運算子 | 說明 | 舉例 |
---|---|---|
&& | 邏輯的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 邏輯的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
5. 字串運算子
下表列出了常用的字串運算子,假定變數 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。 |
6. 檔案測試運算子
檔案測試運算子用於檢測 Unix 檔案的各種屬性。
屬性檢測描述如下:
操作符 | 說明 | 舉例 |
---|---|---|
-b file | 檢測檔案是否是塊裝置檔案,如果是,則返回 true。 | [ -b $file ] 返回 false。 |
-c file | 檢測檔案是否是字元裝置檔案,如果是,則返回 true。 | [ -c $file ] 返回 false。 |
-d file | 檢測檔案是否是目錄,如果是,則返回 true。 | [ -d $file ] 返回 false。 |
-f file | 檢測檔案是否是普通檔案(既不是目錄,也不是裝置檔案),如果是,則返回 true。 | [ -f $file ] 返回 true。 |
-g file | 檢測檔案是否設定了 SGID 位,如果是,則返回 true。 | [ -g $file ] 返回 false。 |
-k file | 檢測檔案是否設定了黏著位(Sticky Bit),如果是,則返回 true。 | [ -k $file ] 返回 false。 |
-p file | 檢測檔案是否是具名管道,如果是,則返回 true。 | [ -p $file ] 返回 false。 |
-u file | 檢測檔案是否設定了 SUID 位,如果是,則返回 true。 | [ -u $file ] 返回 false。 |
-r file | 檢測檔案是否可讀,如果是,則返回 true。 | [ -r $file ] 返回 true。 |
-w file | 檢測檔案是否可寫,如果是,則返回 true。 | [ -w $file ] 返回 true。 |
-x file | 檢測檔案是否可執行,如果是,則返回 true。 | [ -x $file ] 返回 true。 |
-s file | 檢測檔案是否為空(檔案大小是否大於0),不為空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 檢測檔案(包括目錄)是否存在,如果是,則返回 true。 | [ -e $file ] 返回 true。 |
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2017-05/144220p2.htm
相關文章