1、命令替換:``
反向單引號,也稱重音符。鍵盤上和~鍵在一起的那個鍵呦,千萬不要敲成單引號。
A、
使用了``后,shell首先替換輸出中``括起來的date命令,然后執行整個輸出命令。
B、命令替換還可以用於在變量中存儲命令輸出,如下:
變量ctr將包含當前目錄中名字以.txt結尾的文件的計數。
2、expr
大部分shell不支持數字變量,所有變量會被作為字符串。如var=25,變量var中包含的是字符2和字符5組成的字符串,而不是數字25.
Expr命令用來評估算術表達式,命令的輸出發送到標准輸出。
如上圖所示,expr 4 + 5進行整數的加法運算,輸出9.
expr命令支持的算術運算符有:+ 、-、 *、 /、 %。但是*需要使用\進行轉義,否則shell會將*作為通配符處理,如下圖所示:
注意:使用expr命令是,算術運算符的左右兩邊必須添加一個空格。如下圖所示,不添加空格時,不會進行算術運算:
此外,expr命令只支持整數運算,不支持小數,如下所示,使用小數無法獲取正確算術運算結果:
expr命令的輸出將發送到標准輸出,若想輸出存儲到變量中,可以結合命令替換使用:
3、typeset-i
Bash和ksh shell對整數變量提供有限的支持。我們可以使用typeset –i 變量名定義一個整數變量,可以直接使用該整數變量進行算術運算。
4、評估表達式,返回”真”或”假” test/[](方括號)
通常會使用test或[]用來評估條件是否成立。語法如下:
test 表達式
[ 表達式 ]
注意test之后先加空格,再寫表達式。使用[]時,表達式的左右兩邊都需要添加空格。表達式的比較運算符左右兩邊都需要添加一個空格。
表達式里包含多個條件時,可以使用選項-a和-o:
-a:條件同時成立,與,and的意思,
-o:一個條件成立即可,或者,or的意思
test/[]主要用在編程構造中,所以我們在下面的編程構造部分,具體展示其用法。
5、if構造
if構造作用和java中的if語句一樣,語法有所區別
if構造語法:
if condition(s)
then command(s)
[ else command(s) ]
fi
if構造必須以fi結尾,else部分不是必須的,具體看使用場景。
if…elif構造
if condition(s)
then command(s)
elif command(s)
else command(s)
fi
if構造可以有多個elif語句,但只能有一個fi來結束構造,else最多也只能有一個。
課堂練習:
在shell腳本中,腳本文件名字叫testif.sh,實現以下功能:
1、提示用戶輸入成績
2、讀取用戶輸入的成績放到變量mark中
3、如果mark>= 80,提示用戶“you are excellent!”
mark>= 70 && mark <80, 提示“hei,guy,you are good.”
mark >= 60 && mark < 70, 提示“it is ok.”
mark <60 , 提示 “oh, guy ,it is so bad,you should work hard.”
算術測試中的比較運算符使用以下選項表示
等於 -eq
不等於 -ne
大於等於 -ge
大於 -gt
小於等於 -le
小於 -lt
以下為shell腳本文件中語句:
代碼執行效果:
其中判斷條件書寫時,除了使用test,也可以使用[],如:
6、case構造
case … esac構造語法為:
case $variable-name in
value1) command(s) ;;
value2) command(s) ;;
.
.
.
*) command(s) ;;
Esac
該構造用於在shell腳本中根據變量值執行特定的指令集,評估變量的值,並將其與指定的每個值比較。當變量值與指定值之一匹配時,將執行在該值下指定的命令集。
課堂練習:
1、編寫一個shell腳本,文件名字為testcase.sh
2、第一行提示用戶輸入數字年級:
在提示信息的同一行讀取用戶輸入的年級,放到變量grade里
3、如果用戶輸入的是1,就顯示freshman
如果用戶輸入的是2,就顯示sophomore
如果用戶輸入的是3,就顯示junior
如果用戶輸入的是4,就顯示senior
如果用戶輸入的是其他的內容,顯示ni cai
要求本功能使用case實現。
以下為shell腳本文件中語句:
使用case構造時,為任何變量值執行的最后一個命令后必須加一對分號,用於分隔為下一個值執行的命令集中的命令。
7、while構造
while循環的語法:
while condition(s)
do
command(s)
done
這里,只要條件為真,就執行do和done中間的命令。
break和continue語句
break和continue命令可以用於while循環。break表示退出整個循環,continue表示退出當前循環,開始下一次循環。
執行效果如下圖所示:
課堂練習:
1、編寫一個shell腳本,文件名字為testwhile.sh
2、使用while循環打印出1——10之間的數字
以下為shell腳本文件中語句:
或者:
執行效果:
8、until構造
until用法和while一樣,但是是條件不成立時,即條件為假時,才進入循環,條件為真時,結束循環。
9、for構造
for循環語法:
for variable_name in <list_of_values>
do
…
…
Done
for循環將一列值作為輸入,並為循環中的每個值執行該循環,即執行do … done之間的命令。
for循環中的一列值由一個或多個空格分隔。1——9可以用{1..9}表示
課堂練習:
編寫shell腳本文件,輸出九九乘法表:
echo命令后面選項e的作用是讓后面的字符’\t’顯示成特殊字符,即tab鍵,而不是作為普通文本輸出。
執行效果:
補充:seq
Seq語句用於產生從某個數據到另外一個數據之間的所有整數,即序列,並可以指定序列中相鄰兩個整數之間的差值即序列增長的步幅。當只指定序列的起始值和結束值時,步幅為1;當只指定一個數值時,默認該指定數值為結束值,序列默認從1開始,步幅為1;當指定需要指定步幅時,需要先指定起始值,再指定步幅,最后指定結束值。如下圖所示:
將上面九九乘法表中的內層循環改成for循環,就可以在內層循環中使用seq語句的輸出作為內層循環所需要進行循環的列值:
10、exit
exit基於測試命令的結果從shell腳本退出,即停止執行並返回$提示符。exit命令可以用在if構造的if或者else部分中。
上面腳本執行結果:
當用戶輸入y時,退出,不在執行echo “you want to quit.” 語句。
另外,exit命令還可以寫成exit n,n為任意整數。其中整數0表示成功,其他非0值表示不同的失敗原因。在上面九九乘法表中,就使用到了exit 0。
11、test命令復習
test命令除了和if或while等構造結合使用,檢查變量的值之外,還有另外三種用法:
A、test命令選項測試文件狀態
測試文件狀態的各選項,這里不一一列舉,見課本6.11頁。
下面列舉一個例子:
上面腳本執行效果:
B、test用於算術測試
test命令與if結合,可以測試變量的數值,各選項代表的算術測試運算符和用法已在上面if構造部分演示。
C、test命令可以測試字符串
字符串測試運算符見課本6.13頁。
12、創建函數
函數是由同一名稱引用的並用於執行特定任務的語句塊。需要重復執行同一任務時,應該為該任務創建一個函數,通過指定函數名來調用函數。函數必須先定義再調用。
定義函數語法:
function <function_name>
{
<commands>
}
(1)在shell腳本文件中定義函數f1,並添加調用函數語句。函數可以在shell腳本文件中,函數定義之后,可以通過函數名字調用:
執行上面腳本文件后:
(2)在命令符提示后,定義函數f2,並調用函數
(3)將參數傳遞給函數。使用它們的位置來引用傳遞給函數的參數,即利用定義函數時使用位置參數。
在shell腳本文件中定義函數listdir、viewfile、cpfile
如果只在shell腳本文件中定義函數,沒有調用函數語句,那么執行shell腳本文件時,只是創建了函數,不會調用。並且在當前shell即命令提示符之后,也不能直接調用這些函數。
執行source 腳本文件名字 語句后,就可以在當前shell中調用定義的函數了。如下所示:
關於位置參數,將在下面演示。
13、處理shell腳本中的參數
參數用於將自變量從命令行傳遞到shell腳本。參數可以是任何值,通常是文件名或字符串,它是在shell提示符后指定的一個命令名或文件名。在腳本中,作為一個自變量來引用參數。
Shell按照Liunx解釋命令,輸入命令並按回車后,shell會以以下方式將命令行中的每個詞放入到特殊變量:
命令行中的第一個詞,即命令名,會被放入稱為$0的變量。
命令行中的第一個參數,即命令行中的第二個詞,被放入變量$1中。
命令行中的第二個參數,即命令行中的第三個詞,被放入變量$2中。
除$0之外,shell最多可以正確創建9個變量,9個之后存儲的值將不再准確。$1到$9也稱為命令行的位置參數。根據命令中指定的參數的數量,shell將值賦給這些變量中的一些或全部。
Shell還會為以下變量賦值:
$*:包含整串參數
$#:包含命令中指定參數的數量
下面簡單演示如何設置位置參數:
執行效果如下:
使用位置參數,實現復制文件:
執行效果:
14、shift命令
Shell最多只創建9個位置參數,即$0--$9。從第10個開始參數存儲的值將不再正確。
如下所示,測試用戶輸入參數超過9的場景:
執行腳本文件,輸入多個參數,發現$10參數存儲的值為$1參數追加0,$11參數存儲的值為$1參數追加1,這和實際輸入不相符:
實際中,可能會發生用戶輸入參數超過9個情況,shift命令可以允許用戶輸入可變數量的參數,包括超過9個場景,shift可以使用多次。
本例中shift命令效果講解:
本例用來幫助用戶復制或函數文件,如果腳本文件名字之后輸入c表示用戶想要復制文件,輸入d表示用戶想要刪除文件。輸入其它時,給用戶提示參數只能是c或d.
執行效果如下:
15、.bash_file文件
.bash_file文件是特殊的 文件,用戶一登錄系統時即執行此腳本。該文件可選,存在用戶的 home目錄中,是隱藏文件,ls命令中,-a選項可以查看隱藏文件:
16、here文檔
對命令或shell腳本的輸入通常包含在一個單獨的文件中,然后會作為參數提供給腳本。還能將輸入數據包含在shell腳本自身中,然后數據被認為是在一個here文檔中,即輸入就在這里,而不是在其他地方的某個文件中。<<運算符實現此類構造。
<<運算符用法:
command << pattern
:
:
pattern
上面兩個pattern中之間 的內容視為輸入,所以pattern必須成對出現,如果缺少第二個,則會認為從第一個pattern至文件末尾的內容全部都是輸入內容,不會認為是特殊命令。
pattern只是起一個標識作用,可以用任何字符串來表示。第二個pattern需要定格寫。
Here文檔的一種用法是顯示菜單,與使用多條echo語句相比,here文檔是構建菜單屏幕的有效方式。
我們使用here文檔改寫一下前面的帶選擇菜單的while循環:
執行效果:
17、調試shell腳本
使用set命令結合-x、-v選項調試shell腳本。
下面演示在sh <filename> 命令中調用-x 或-v選項:
sh-v <filename>:
執行腳本時,首先顯示腳本中書寫的每行語句,然后顯示執行語句后的結果
sh-x <filename>:
與sh -v <filename>類似,也是將shell文件中書寫的每行語句顯示出來,但是-x選項會在每行語句前面加+,並且還會對每個語句和表達式進行變量值的替換,然后顯示語句的執行結果。