shell腳本等的操作


1、命令替換:``

反向單引號,也稱重音符。鍵盤上和~鍵在一起的那個鍵呦,千萬不要敲成單引號。

A、

wps4416.tmp

使用了``后,shell首先替換輸出中``括起來的date命令,然后執行整個輸出命令。

B、命令替換還可以用於在變量中存儲命令輸出,如下:

wps4426.tmp

變量ctr將包含當前目錄中名字以.txt結尾的文件的計數。

2、expr

大部分shell不支持數字變量,所有變量會被作為字符串。如var=25,變量var中包含的是字符2和字符5組成的字符串,而不是數字25.

Expr命令用來評估算術表達式,命令的輸出發送到標准輸出。

wps4427.tmp

如上圖所示,expr 4 + 5進行整數的加法運算,輸出9.

wps4428.tmp

expr命令支持的算術運算符有:+ 、-、 *、 /、 %。但是*需要使用\進行轉義,否則shell會將*作為通配符處理,如下圖所示:

wps4439.tmp

注意:使用expr命令是,算術運算符的左右兩邊必須添加一個空格。如下圖所示,不添加空格時,不會進行算術運算:

wps443A.tmp

此外,expr命令只支持整數運算,不支持小數,如下所示,使用小數無法獲取正確算術運算結果:

wps443B.tmp

expr命令的輸出將發送到標准輸出,若想輸出存儲到變量中,可以結合命令替換使用:

wps444C.tmp

3、typeset-i

Bash和ksh shell對整數變量提供有限的支持。我們可以使用typeset –i 變量名定義一個整數變量,可以直接使用該整數變量進行算術運算。

wps444D.tmp

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腳本文件中語句:

wps444E.tmp

代碼執行效果:

wps445E.tmp

其中判斷條件書寫時,除了使用test,也可以使用[],如:

wps445F.tmp

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腳本文件中語句:

wps4470.tmp

使用case構造時,為任何變量值執行的最后一個命令后必須加一對分號,用於分隔為下一個值執行的命令集中的命令。

7、while構造

while循環的語法:

while  condition(s)

do

      command(s)

done

這里,只要條件為真,就執行do和done中間的命令。

break和continue語句

break和continue命令可以用於while循環。break表示退出整個循環,continue表示退出當前循環,開始下一次循環。

wps4471.tmp

執行效果如下圖所示:

wps4472.tmp

課堂練習:

1、編寫一個shell腳本,文件名字為testwhile.sh

2、使用while循環打印出1——10之間的數字

以下為shell腳本文件中語句:

wps4482.tmp

或者:

wps4483.tmp

執行效果:

wps4484.tmp

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腳本文件,輸出九九乘法表:

wps4495.tmp

echo命令后面選項e的作用是讓后面的字符’\t’顯示成特殊字符,即tab鍵,而不是作為普通文本輸出。

執行效果:

wps4496.tmp

補充:seq

Seq語句用於產生從某個數據到另外一個數據之間的所有整數,即序列,並可以指定序列中相鄰兩個整數之間的差值即序列增長的步幅。當只指定序列的起始值和結束值時,步幅為1;當只指定一個數值時,默認該指定數值為結束值,序列默認從1開始,步幅為1;當指定需要指定步幅時,需要先指定起始值,再指定步幅,最后指定結束值。如下圖所示:

wps4497.tmp

將上面九九乘法表中的內層循環改成for循環,就可以在內層循環中使用seq語句的輸出作為內層循環所需要進行循環的列值:

wps44A8.tmp

10、exit

exit基於測試命令的結果從shell腳本退出,即停止執行並返回$提示符。exit命令可以用在if構造的if或者else部分中。

wps44A9.tmp

上面腳本執行結果:

wps44AA.tmp

當用戶輸入y時,退出,不在執行echo “you want to quit.” 語句。

另外,exit命令還可以寫成exit n,n為任意整數。其中整數0表示成功,其他非0值表示不同的失敗原因。在上面九九乘法表中,就使用到了exit 0。

11、test命令復習

test命令除了和if或while等構造結合使用,檢查變量的值之外,還有另外三種用法:

A、test命令選項測試文件狀態

測試文件狀態的各選項,這里不一一列舉,見課本6.11頁。

下面列舉一個例子:

wps44BA.tmp

上面腳本執行效果:

wps44BB.tmp

B、test用於算術測試

test命令與if結合,可以測試變量的數值,各選項代表的算術測試運算符和用法已在上面if構造部分演示。

C、test命令可以測試字符串

字符串測試運算符見課本6.13頁。

12、創建函數

函數是由同一名稱引用的並用於執行特定任務的語句塊。需要重復執行同一任務時,應該為該任務創建一個函數,通過指定函數名來調用函數。函數必須先定義再調用。

定義函數語法:

function <function_name>

{

    <commands>

}

(1)在shell腳本文件中定義函數f1,並添加調用函數語句。函數可以在shell腳本文件中,函數定義之后,可以通過函數名字調用:

wps44BC.tmp

執行上面腳本文件后:

wps44CD.tmp

(2)在命令符提示后,定義函數f2,並調用函數

wps44CE.tmp

(3)將參數傳遞給函數。使用它們的位置來引用傳遞給函數的參數,即利用定義函數時使用位置參數。

在shell腳本文件中定義函數listdir、viewfile、cpfile

wps44DE.tmp

如果只在shell腳本文件中定義函數,沒有調用函數語句,那么執行shell腳本文件時,只是創建了函數,不會調用。並且在當前shell即命令提示符之后,也不能直接調用這些函數。

執行source 腳本文件名字 語句后,就可以在當前shell中調用定義的函數了。如下所示:

wps44DF.tmp

關於位置參數,將在下面演示。

13、處理shell腳本中的參數

參數用於將自變量從命令行傳遞到shell腳本。參數可以是任何值,通常是文件名或字符串,它是在shell提示符后指定的一個命令名或文件名。在腳本中,作為一個自變量來引用參數。

         Shell按照Liunx解釋命令,輸入命令並按回車后,shell會以以下方式將命令行中的每個詞放入到特殊變量:

命令行中的第一個詞,即命令名,會被放入稱為$0的變量。

命令行中的第一個參數,即命令行中的第二個詞,被放入變量$1中。

命令行中的第二個參數,即命令行中的第三個詞,被放入變量$2中。

除$0之外,shell最多可以正確創建9個變量,9個之后存儲的值將不再准確。$1到$9也稱為命令行的位置參數。根據命令中指定的參數的數量,shell將值賦給這些變量中的一些或全部。

Shell還會為以下變量賦值:

         $*:包含整串參數

         $#:包含命令中指定參數的數量

下面簡單演示如何設置位置參數:

wps44E0.tmp

執行效果如下:

wps44F1.tmp

使用位置參數,實現復制文件:

wps44F2.tmp

執行效果:

wps44F3.tmp

14、shift命令

Shell最多只創建9個位置參數,即$0--$9。從第10個開始參數存儲的值將不再正確。

如下所示,測試用戶輸入參數超過9的場景:

wps4504.tmp

執行腳本文件,輸入多個參數,發現$10參數存儲的值為$1參數追加0,$11參數存儲的值為$1參數追加1,這和實際輸入不相符:

wps4505.tmp

實際中,可能會發生用戶輸入參數超過9個情況,shift命令可以允許用戶輸入可變數量的參數,包括超過9個場景,shift可以使用多次。

wps4506.tmp

本例中shift命令效果講解:

wps4516.tmp

本例用來幫助用戶復制或函數文件,如果腳本文件名字之后輸入c表示用戶想要復制文件,輸入d表示用戶想要刪除文件。輸入其它時,給用戶提示參數只能是c或d.

執行效果如下:

wps4517.tmp

15、.bash_file文件

.bash_file文件是特殊的 文件,用戶一登錄系統時即執行此腳本。該文件可選,存在用戶的 home目錄中,是隱藏文件,ls命令中,-a選項可以查看隱藏文件:

wps4518.tmp

16、here文檔

對命令或shell腳本的輸入通常包含在一個單獨的文件中,然后會作為參數提供給腳本。還能將輸入數據包含在shell腳本自身中,然后數據被認為是在一個here文檔中,即輸入就在這里,而不是在其他地方的某個文件中。<<運算符實現此類構造。

<<運算符用法:

command  << pattern

pattern

上面兩個pattern中之間 的內容視為輸入,所以pattern必須成對出現,如果缺少第二個,則會認為從第一個pattern至文件末尾的內容全部都是輸入內容,不會認為是特殊命令。

pattern只是起一個標識作用,可以用任何字符串來表示。第二個pattern需要定格寫。

Here文檔的一種用法是顯示菜單,與使用多條echo語句相比,here文檔是構建菜單屏幕的有效方式。

我們使用here文檔改寫一下前面的帶選擇菜單的while循環:

wps4529.tmp

執行效果:

wps452A.tmp

17、調試shell腳本

使用set命令結合-x、-v選項調試shell腳本。

下面演示在sh <filename> 命令中調用-x 或-v選項:

sh-v <filename>

wps452B.tmp

執行腳本時,首先顯示腳本中書寫的每行語句,然后顯示執行語句后的結果

sh-x <filename>

wps453B.tmp

與sh -v <filename>類似,也是將shell文件中書寫的每行語句顯示出來,但是-x選項會在每行語句前面加+,並且還會對每個語句和表達式進行變量值的替換,然后顯示語句的執行結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM