小綜合

第四節shell腳本中進行while循環

在某些情況下,需要依據某個條件進行判斷,如果條件爲真則繼續循環,否則結束循環,這種情況下,就需要使用while循環。while循環是當某個判定條件的值爲假時退出循環。

語法如下:

while 條件表達式

do

命令串;

done

執行過程:

先執行條件表達式,如果其退出狀態爲 0,就執行循環體。執行到關鍵字 done 後,回到循環的頂部,while命令再次檢查條件表達式的退出狀態。以此類推,循環將一直繼續下去,直到條件表達式的退出狀態非 0 爲止。


第五節shell腳本中使用util循環

util循環和while循環實現的功能基本相同,不過util是判定條件爲假時才繼續循環。

語法如下:

util 條件表達式

do

命令行;

done

第六節shell腳本中使用函數

對於在腳本中經常重複使用的功能模塊,可以將其封裝成函數。在shell腳本中使用函數,可以使程序代碼更加簡潔,程序的可讀性更好。shell腳本中函數的定義有如下兩個:

函數名()

{

……

}

或者:

function 函數名()

{

……

}

在調用函數時,可以向函數傳遞任意個數的參數。在函數中可以通過位置參數$1,$2的方式進行引用。函數也可以有返回值,可以通過查詢全局變量$?的值獲取函數的返回值。

第七節 shell腳本之echoexpr講解

echo命令

功能說明:顯示文字

法:echo [-ne][字符串] echo [--help][--version]

補充說明:echo會將輸入的字符串送往標準輸出。輸出的字符串間以空白字符隔開, 並在最後加上換行號。

-n 不進行換行

-e若字符串中出現以下字符,則特別加以處理,而不會將它當成一般文字輸出 \n 換行 \b 空格...

-n 不要在最後自動換行

-e 若字符串中出現以下字符,則特別加以處理,而不會將它當成一般文字輸出:

\a 發出警告聲;

\b 刪除前一個字符;

\c 最後不加上換行符號;

\f 換行但光標仍舊停留在原來的位置;

\n 換行且光標移至行首;

\r 光標移至行首,但不換行;

\t 插入tab

\v \f相同

\\ 插入\字符

\nnn 插入nnn八進制所代表的ASCII字符

--help 顯示幫助

--version 顯示版本信息

expr命令

生成隨機數的特殊變量:

echo $RANDOM範圍是: [0,32767]

expr:通用的表達式計算命令

注意:表達式中參數與操作符必須以空格分開,表達式中的運算可以是算術運算,

比較運算,字符串運算和邏輯運算

1expr命令一般用於整數值,但也可用於字符串。

如:

expr 5 % 3

expr 5 \* 3# 乘法符號必須被轉義

2expr也是一個手工命令行計數器。如:

$expr 10 + 10打印20

$expr 30 / 3打印:10

$expr 30 / 3 / 2打印:5

注意:使用乘號時,必須用反斜線屏蔽其特定含義。因爲shell可能會誤解顯示星號的意義(shell中的反斜槓“\”,有大部分是這種轉意的意思)。如:

expr 30 \* 3打印:90


3.數值測試。可以用expr測試一個數。如果試圖計算非整數,將返回錯誤。如:

$rr=1.1
$expr $rr + 1
以上兩句將打印:expr: non-numeric argument

$rr=2
$expr $rr + 1
以上兩句將打印:3

這裏需要將一個值賦予變量(不管其內容如何),進行數值運算,並將輸出導入dev/null,然後測試最後命令狀態,如果爲0,證明這是一個數,其他則表明爲非數值。

$value=12
$expr $value + 10 > /dev/null 2>&1
$echo $?
以上三句將打印:0這是一個數。

$value=hello
$expr $value + 10 > /dev/null 2>&1
$echo $?
以上三句將打印:2這是一個非數值字符。

expr也可以返回其本身的退出狀態,不幸的是返回值與系統最後退出命令剛好相反,成功返回1,任何其他值爲無效或錯誤。下面的例子測試兩個字符串是否相等,這裏字符串爲“hello”“hello”
$value=hello
$expr $value = "hello"
此時打印:1

$echo $?此時打印:0

expr返回1。不要混淆了,這表明成功。現在檢驗其最後退出狀態,返回0表示測試成功,“hello”確實等於“hello”


4模式匹配。expr也有模式匹配功能。可以使用expr通過指定冒號選項計算字符串中字符數。.*意即任何字符重複0次或多次。如:

$value=accounts.doc
$expr $value : '.*'

expr中可以使用字符串匹配操作,這裏使用模式. d o c抽取文件附屬名。
$expr $value : '(.*).doc'

則會打印:accounts


對於expr的解釋估計有人會說寫得很羅嗦。我想說的是,expr的確很重要!在後面的腳本學習中,對於大型程序,很多地方用到了expr

第八節 shell腳本循環終止之break continue

break [n]

1.用於強行退出當前循環。

2.如果是嵌套循環 break 命令後面可以跟一數字 n

表示退出第 n 重循環(最裏面的爲第一重循環)。

continue [n]

1.用於忽略本次循環的剩餘部分,回到循環的頂部,繼續下一次循環。

2.如果是嵌套循環,continue命令後面也可跟一數字 n,表示回到第 n 重循環的頂部。

第九節 shell腳本之exit sleep

exit 命令: exit n

exit 命令用於退出腳本或當前進程。n是一個從 0 255 的整數,

0 表示成功退出,非零表示遇到某種失敗而非正常退出。該整數被保存在狀態變量 $? 中。

sleep 命令:sleep n

暫停 n 秒鐘


第十節 shell腳本之select 循環與菜單

語法結構:

select variable in list

do# 循環開始的標誌

commands # 循環變量每取一次值,循環體就執行一遍

done# 循環結束的標誌

說明:

1.select 循環主要用於創建菜單,按數字順序排列的菜單項將顯示在標準錯誤上,並顯示 PS3 提示符,等待用戶輸入

2.用戶輸入菜單列表中的某個數字,執行相應的命令

3.用戶輸入被保存在內置變量REPLY 中。

select case

1.select 是個無限循環,因此要記住用break 命令退出循環,

或用 exit 命令終止腳本。也可以按 ctrl+c 退出循環。

2.select 經常和 case 聯合使用

3. for 循環類似,可以省略 in list ,此時使用位置參量


第十一節 shell腳本之循環控制 shift 命令

shift [n]

1.用於將參量列表list 左移指定次數,缺省爲左移一次。

2.參量列表 list 一旦被移動,最左端的那個參數就從列表中刪除。

while 循環遍歷位置參量列表時,常用到 shift

例如:

./doit.sh a b c d e f g h

./shft.sh a b c d e f g h


第十二節 shell腳本之字符串操作

字符串操作:

${#var}返回字符串變量 var 的長度

${var:m}返回${var}中從第m個字符到最後的部分,其中,m的取值從0${#var}-1,下同

${var:m:len} 返回${var}中從第m個字符開始,長度爲len的部分

${var#pattern}刪除${var}中開頭部分與pattern匹配的最小部分

${var##pattern}刪除${var}中開頭部分與pattern匹配的最大部分

${var%pattern}刪除${var}中結尾部分與pattern匹配的最小部分

${var%%pattern}刪除${var}中結尾部分與pattern匹配的最大部分

${var/old/new}new替換${var}中第一次出現的old

${var//old/new}new替換${var}中所有的old(全局替換)

注:patternold 中可以使用通配符,


第十三節 shell腳本之數組實現

Shell中的數組用下面的方式來定義:

$varname[0]=value1
$varname[1]=value2
....

$echo ${varname[0]}方式來引用


第十四節 shell腳本之腳本調試

1. sh –x 腳本名

說明:該選項可以使用戶跟蹤腳本的執行,此時 shell 對腳本中每條命令的處理過程爲:先執行替換,然後顯示,再執行它。shell 顯示腳本中的行時,會在行首添加一個加號 “ + ”

2. sh –v 腳本名

說明:在執行腳本之前,按輸入的原樣打印腳本中的各行,打印一行執行一行。

3. sh –n 腳本名

說明:對腳本進行語法檢查,但不執行腳本。如果存在語法錯誤,shell 會報錯,

如果沒有錯誤,則不顯示任何內容。


第十五節 shell腳本之編程小結

變量:

1. 局部變量、環境變量(exportdeclare -x

2. 只讀變量、整型變量

例:declare-i x; x="hello"; echo $x# 打印 0

3. 位置參量($0,$1,...,$*,$@,$#,$$,$?

4. 變量的間接引用(eval,${!str}

例:name="hello";x="name"; echo ${!x} # 打印 hello

5. 命令替換(`cmd`$(cmd)

6. 整數運算

declare 定義的整型變量可以直接進行運算,否則需用 let 命令

$[...]$((...)) 進行整數運算。

輸入輸出:

1. 輸入:read

read var1 var2 ...

read->REPLY

read –p "提示" -> REPLY


2. 輸出:printf


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章