shell编程-分支语句
生活随笔
收集整理的這篇文章主要介紹了
shell编程-分支语句
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目標:
完成這一章,你將能夠作以下事情:
描述條件分支語句中返回值的作用。?
使用test命令來分析一個命令的返回值。?
在shell程序中使用if和case結構。?
1.返回值
shell變量“?”中保存上一個被執行命令的返回值:
0: 命令成功地執行(真)
非零: 命令由于出現錯誤而被終止(假)
例子:
$ true $ false
$ echo $? $ echo $?
0 1
$ ls $ cp?
$ echo $? Usage: cp f1 f2
0 cp [-r] f1 ....fn d1
$ echo $? $echo $?
0 1
$echo $?
0
UNIX操作系統的所有命令在結束的時候都會產生一個返回值。這個返回值通常被用來判斷命令是正常結束(返回0)還是發生了錯誤(返回非零值)。通過返回的非零值還可以看出發生的是什么錯誤。例如,語法錯誤通常返回1,true命令返回的就是0,而false命令返回的是1。
大多數的shell程序中的判斷語句都是通過分析這個返回值來進行流程控制的。shell中定義了一個特殊的變量“?”用來保存上一個命令結束后的返回值。
你可以通過以下方式來觀察前一個命令的返回值:
echo $?
當你執行一個條件判斷(小于,大于,等于)的時候,返回值會指明這個條件是否為真(返回0)或者為假(返回非零)。
條件判斷語句會在下幾節中講述。
2.test 命令
語法:
test expression 或者 [expression]
test命令對表達式進行測試,并且設置返回值。
表達式的值 返回值
true 0
false 非零(通常為1)
test命令能夠測試的對象有:
整數?
字符串?
文件?
test命令被用來評估表達式并且產生返回值。它用參數組成邏輯表達式并且對表達式的返回值進行評估,test命令不會產生標準輸出,你必須必須通過返回值來判斷test命令的結果,如果表達式為真,返回值會為0,如果表達式為假,返回值為1。
test命令可以被單獨使用,然后你能夠看到返回值,但它用的最多的還是在if和while結構中用來提供條件流程控制。
test命令的也可以用[expression]來代替。這種方式可以提高可讀性,特別是在處理數字或者字符串的時候。
注意:在"["和"]"符號的周圍必須要有空格。
3.test命令之數字test
語法:
[ number relation number ] 通過關系運算符來對數字進行比較
關系運算符:
-lt 小于
-le 小于或者等于
-gt 大于
-ge 大于或者等于
-eq 等于
-ne 不等于
例子(假設X=3):
$ [ "$X" -lt 7] $ [ "$X" -gt 7]
$ echo $? $ echo $?
0 1
test命令能被用于比較兩個整數之間的數字關系,通常用[.....]語法來調用。test命令的返回值就能說明這個條件為真還是為假。
當test一個變量的值的時候,你應該防止變量不要為空值,例如:
$ [ $XX -eq 3]
sh: test:argument expected
如果變量XX在前面沒有被賦值,XX的值會是NULL。當shell執行變量替代的時候,shell會試圖執行如下語句:
[ -eg 3]
而這個語句不是一個完整的test語句,并且會導致一個語法錯誤。解決這個問題的一個簡單的方法就是在被測試的變量的周圍加上引號。
[ "$XX" -eq 3]
當shell執行變量替代的時候,shell會試圖執行如下語句:
["" -eq 3]
這會確保至少有一個NULL值作為一個參數提供給這個test命令使用。
注意:作為一個通用的規則,你應該在所有的$變量加上雙引號來避免shell發生不正確的變量的替代。
4.test命令-字符串test
語法:
[ string1 = string2] 判斷字符串是否相等
[ string1 !=string2] 判斷字符串是否不等
例子;
$ X=abc $ X=abc
$ [ "$X" = "abc"] $ ["$X" != "abc"]
$ echo $? $ echo $?
0 1
test命令也能夠用來計較兩個字符串是否相等。
[...] 語法通常用作字符串的比較。你已經看到在[]周圍必須要有空格,同時在操作符周圍也必須要有空格存在。
字符串操作包括:
string1 = string2 如果string1等于string2就為真
string1 != string2 如果string1不等于string2就為真
-z string 如果string的長度為0就為真
-n string 如果string的長度為非零就為真
string 如果string的長度為非零就為真
為了防止變量中包含空白字符,這里引號同樣也能夠保護字符串的test,,例如:
$ X="yes we will"
$ [ $X=yes] 會導致一個語法錯誤
shell會解釋這個語句為[yes we will = yes ]
$ [ "$x" = yes ] 正確的語法
shell會解釋這個語句為:[ "yes we will" = yes ]
在執行數字比較的時候,shell會將所有的參數當成是數字,在執行字符串比較的時候,shell會把所有的參數當成是字符串。如下例所示:
$ X=03
$ Y=3
$ [ "$X" -eq "$Y" ] 比較數字03和數字3
$ echo $?
0 為真,因為它們是相等的數字
$ [ "$X" = "$Y" ] 比較字符串“03”和字符串“3”
$ echo $?
1 為假,因為它們是不相同的字符串
5.test命令- 文件比較
語法:
test -option filename 通過選項對文件進行test
例子:
$ test -f funfile
$ echo $?
0
$ test -d funfile
$ echo $?
1
shell提供的一個有用的test特性是可以用它來test文件的特征,例如文件類型和許可權限。例如:
$ test -f filename
如果文件存在并且是一個普通文件(不是目錄或者設備文件),會返回真(0)。
test -s filename
如果文件存在并且其字節數大于0,會返回真(0)。
其它還有許多有用的文件test方式,比如:
-r file 如果文件存在并且是可讀的時候為真
-w file 如果文件存在并且是可寫的時候為真
-x file 如果文件存在并且是可執行的時候為真
-d directory 目錄存在并且是個目錄的時候為真
6.test命令-其他操作符
語法:
-o OR
-a AND
\( \) GROUPING
例子:
$ [ "$ANS" = y -o "ANS' = Y ]
$ [ "$NUM -gt 10 -a "$NUM" -lt 20 ]
$ test -s file -a -r file
注意:()前面必須要用斜杠。
使用Boolean操作符可以同時測試多個條件。
例子:
$ [ "$ANS" = y -o "$ANS" = Y ]
$ [ "$NUM" -gt 10 -a "$NUM" -lt 20 ]
$ test -s file -a -r file -a -x file
NOT操作符(!)被用作連接其他的操作符,特別是在文件test的時候用的很普遍。在!操作符和其他的操作符之間必須要有空格,例如:
test ! -d file
能夠用來代替
test -f file -o -c file -o -b file ....
括號被用來對操作符進行分組,但是在shell中括號還有一個特殊的意義就是優先運算的意義。因此,括號前面必須使用\符號來忽略其原有含義。
以下的命令驗證:有兩個命令行參數,并且第一個命令行參數是一個-m ,并且最后一個命令行參數是一個目錄或者是一個字節數大于0的文件:
[ \( $# = 2 \) -a \( "$1" = "-m" \) -a \( -d "$2" -o -s "$2" \) ]
7.exit命令
語法:
exit [arg]
例子:
$ cat exit_test
echo exiting program now
exit 99
$ exit_test
exiting_program now
$ echo $?
99
exit命令結束當前shell程序的執行并且設置返回值。通常0被用來說明正常結束,而非0值用來說明一個錯誤的條件。如果沒有特別指明返回值,返回值將被設置為exit命令上一個命令的返回值。
8.if語句
語法:(用于單向判斷分支)
if
list A
then
list B
fi
例子:
if?
test -s funfile
then
echo funfile exists
fi
echo hello
if 結構是一種基于命令返回值的的流程控制方式。如果測試命令的返回值為0,一個指定的命令列表就會被執行,如果用于判斷的命令返回值為非0,指定命令列表會被忽略而不被執行。
上例中表明了if結構的一個通用的格式:每一個命令列表由一個或者多個UNIX系統的shell命令組成,每個命令之間用回車符或者分號分隔,list A中最后被執行的命令決定if語句的結果。
if結構執行的過程如下所示:
1.list A命令被執行。
2.如果list A中的最后一個命令的返回值為0(真),執行list B中的命令,然后繼續執行fi以后的命令。
3.如果list A中的最后一個命令的返回值為非0(假),跳到fi并且繼續執行fi以后的命令。
test命令通常被用作流程控制,它可以使用任何的UNIX命令,因為所有的UNIX命令都產生一個返回值,以下的例子可以說明:
if
grep kingkong /etc/passwd > /dev/null
then
echo found kingkong
fi
if結構也能在程序出錯的時候提供流程控制。如下例所示:
if?
[ $# -ne 3 ]
then
echo Incorrect syntax
echo Usage: cmd arg1 arg2 arg3
exit 99
fi
9.if-else 結構
語法:(用在多分支選擇的情況)
if
list A
then
list B
else
list C
fi
例子:
if [ "$X" -lt 10 ]
then
echo X is less than 10
else
echo X is not less than 10
fi
if-else結構讓你能夠在控制命令的返回值為0的情況下執行一系列的命令,或者在控制命令的返回值為非0的情況下執行另外一系列的命令。
這種情況下if結構的執行過程是:
1.執行list A中的命令。
2.如果在list A中最后一個命令的返回值是0(真),執行list B中的命令,然后繼續執行fi以后的命令。
3.如果list A中最后一個命令的返回值為非0(假),執行list C中的命令,然后執行fi以后的命令。
注意在list C中可以包含任何的UNIX命令,其中也包括if。例如:
if?
[ "$X" -lt 10 ]
then
echo X is less than 10
else
if
[ "$X" -gt 10 ]
then
echo X is greater than 10
else
echo X is equal to 10
fi
fi
注意:每一個if必須要有一個fi來結束。
10.case結構
語法:(多路分支)
case word in
patterm1) list A
;;
pattern2) list B
;;
patternN) list N
;;
esac
例子:
case $ANS in
yes) echo O.K
;;
no) echo no go
;;
esac
if-else結構也能支持多路的分支,但是當有兩個或者三個分支的之后,程序會變得十分難以閱讀。case結構提供了實現多路分支的一種更方便的方法。分支選擇是順序地對一個word與提供的參數之間的比較結果。這些比較是是嚴格的基于字符串的對比。當一個匹配成功的時候,對應的命令就會被執行。每個命令的列表都以兩個分號結束。在完成了相關的比較之后,程序會在esac之后繼續執行下去。
word典型的情況下是指向一個shell變量。
pattern的組成格式和文件名的生成原則是一致的。
以下是一些pattern允許的特殊的字符:
* 匹配任何字符串和字符包括空字符
? 匹配任何單個的字符。
[...] 匹配任何一個括號出現中的字符
另外|字符的意義是OR。
注意:在這個結構中的右括號和分號是必須的。
case結構通常被用于菜單選擇或者是需要對幾個用戶輸入選項作出選擇的時候。
12.shell編程 - 分支:總結
返回值 每一個程序的返回值 - echo $?
數字test [ "$num1" -lt "$num2" ]
字符串test [ $string1 = $string2 ]
文件test test -f filename
exit n 終止程序的允許并且設置返回值
if case word in
command listA pattern1) command list
then ;;
command listB pattern2) command list
else ;;
command listC *) command list
fi ;;
esac
執行那個語句基于listA中最后一條 字符串word會與每一個pattern比較
命令的返回值
完成這一章,你將能夠作以下事情:
描述條件分支語句中返回值的作用。?
使用test命令來分析一個命令的返回值。?
在shell程序中使用if和case結構。?
1.返回值
shell變量“?”中保存上一個被執行命令的返回值:
0: 命令成功地執行(真)
非零: 命令由于出現錯誤而被終止(假)
例子:
$ true $ false
$ echo $? $ echo $?
0 1
$ ls $ cp?
$ echo $? Usage: cp f1 f2
0 cp [-r] f1 ....fn d1
$ echo $? $echo $?
0 1
$echo $?
0
UNIX操作系統的所有命令在結束的時候都會產生一個返回值。這個返回值通常被用來判斷命令是正常結束(返回0)還是發生了錯誤(返回非零值)。通過返回的非零值還可以看出發生的是什么錯誤。例如,語法錯誤通常返回1,true命令返回的就是0,而false命令返回的是1。
大多數的shell程序中的判斷語句都是通過分析這個返回值來進行流程控制的。shell中定義了一個特殊的變量“?”用來保存上一個命令結束后的返回值。
你可以通過以下方式來觀察前一個命令的返回值:
echo $?
當你執行一個條件判斷(小于,大于,等于)的時候,返回值會指明這個條件是否為真(返回0)或者為假(返回非零)。
條件判斷語句會在下幾節中講述。
2.test 命令
語法:
test expression 或者 [expression]
test命令對表達式進行測試,并且設置返回值。
表達式的值 返回值
true 0
false 非零(通常為1)
test命令能夠測試的對象有:
整數?
字符串?
文件?
test命令被用來評估表達式并且產生返回值。它用參數組成邏輯表達式并且對表達式的返回值進行評估,test命令不會產生標準輸出,你必須必須通過返回值來判斷test命令的結果,如果表達式為真,返回值會為0,如果表達式為假,返回值為1。
test命令可以被單獨使用,然后你能夠看到返回值,但它用的最多的還是在if和while結構中用來提供條件流程控制。
test命令的也可以用[expression]來代替。這種方式可以提高可讀性,特別是在處理數字或者字符串的時候。
注意:在"["和"]"符號的周圍必須要有空格。
3.test命令之數字test
語法:
[ number relation number ] 通過關系運算符來對數字進行比較
關系運算符:
-lt 小于
-le 小于或者等于
-gt 大于
-ge 大于或者等于
-eq 等于
-ne 不等于
例子(假設X=3):
$ [ "$X" -lt 7] $ [ "$X" -gt 7]
$ echo $? $ echo $?
0 1
test命令能被用于比較兩個整數之間的數字關系,通常用[.....]語法來調用。test命令的返回值就能說明這個條件為真還是為假。
當test一個變量的值的時候,你應該防止變量不要為空值,例如:
$ [ $XX -eq 3]
sh: test:argument expected
如果變量XX在前面沒有被賦值,XX的值會是NULL。當shell執行變量替代的時候,shell會試圖執行如下語句:
[ -eg 3]
而這個語句不是一個完整的test語句,并且會導致一個語法錯誤。解決這個問題的一個簡單的方法就是在被測試的變量的周圍加上引號。
[ "$XX" -eq 3]
當shell執行變量替代的時候,shell會試圖執行如下語句:
["" -eq 3]
這會確保至少有一個NULL值作為一個參數提供給這個test命令使用。
注意:作為一個通用的規則,你應該在所有的$變量加上雙引號來避免shell發生不正確的變量的替代。
4.test命令-字符串test
語法:
[ string1 = string2] 判斷字符串是否相等
[ string1 !=string2] 判斷字符串是否不等
例子;
$ X=abc $ X=abc
$ [ "$X" = "abc"] $ ["$X" != "abc"]
$ echo $? $ echo $?
0 1
test命令也能夠用來計較兩個字符串是否相等。
[...] 語法通常用作字符串的比較。你已經看到在[]周圍必須要有空格,同時在操作符周圍也必須要有空格存在。
字符串操作包括:
string1 = string2 如果string1等于string2就為真
string1 != string2 如果string1不等于string2就為真
-z string 如果string的長度為0就為真
-n string 如果string的長度為非零就為真
string 如果string的長度為非零就為真
為了防止變量中包含空白字符,這里引號同樣也能夠保護字符串的test,,例如:
$ X="yes we will"
$ [ $X=yes] 會導致一個語法錯誤
shell會解釋這個語句為[yes we will = yes ]
$ [ "$x" = yes ] 正確的語法
shell會解釋這個語句為:[ "yes we will" = yes ]
在執行數字比較的時候,shell會將所有的參數當成是數字,在執行字符串比較的時候,shell會把所有的參數當成是字符串。如下例所示:
$ X=03
$ Y=3
$ [ "$X" -eq "$Y" ] 比較數字03和數字3
$ echo $?
0 為真,因為它們是相等的數字
$ [ "$X" = "$Y" ] 比較字符串“03”和字符串“3”
$ echo $?
1 為假,因為它們是不相同的字符串
5.test命令- 文件比較
語法:
test -option filename 通過選項對文件進行test
例子:
$ test -f funfile
$ echo $?
0
$ test -d funfile
$ echo $?
1
shell提供的一個有用的test特性是可以用它來test文件的特征,例如文件類型和許可權限。例如:
$ test -f filename
如果文件存在并且是一個普通文件(不是目錄或者設備文件),會返回真(0)。
test -s filename
如果文件存在并且其字節數大于0,會返回真(0)。
其它還有許多有用的文件test方式,比如:
-r file 如果文件存在并且是可讀的時候為真
-w file 如果文件存在并且是可寫的時候為真
-x file 如果文件存在并且是可執行的時候為真
-d directory 目錄存在并且是個目錄的時候為真
6.test命令-其他操作符
語法:
-o OR
-a AND
\( \) GROUPING
例子:
$ [ "$ANS" = y -o "ANS' = Y ]
$ [ "$NUM -gt 10 -a "$NUM" -lt 20 ]
$ test -s file -a -r file
注意:()前面必須要用斜杠。
使用Boolean操作符可以同時測試多個條件。
例子:
$ [ "$ANS" = y -o "$ANS" = Y ]
$ [ "$NUM" -gt 10 -a "$NUM" -lt 20 ]
$ test -s file -a -r file -a -x file
NOT操作符(!)被用作連接其他的操作符,特別是在文件test的時候用的很普遍。在!操作符和其他的操作符之間必須要有空格,例如:
test ! -d file
能夠用來代替
test -f file -o -c file -o -b file ....
括號被用來對操作符進行分組,但是在shell中括號還有一個特殊的意義就是優先運算的意義。因此,括號前面必須使用\符號來忽略其原有含義。
以下的命令驗證:有兩個命令行參數,并且第一個命令行參數是一個-m ,并且最后一個命令行參數是一個目錄或者是一個字節數大于0的文件:
[ \( $# = 2 \) -a \( "$1" = "-m" \) -a \( -d "$2" -o -s "$2" \) ]
7.exit命令
語法:
exit [arg]
例子:
$ cat exit_test
echo exiting program now
exit 99
$ exit_test
exiting_program now
$ echo $?
99
exit命令結束當前shell程序的執行并且設置返回值。通常0被用來說明正常結束,而非0值用來說明一個錯誤的條件。如果沒有特別指明返回值,返回值將被設置為exit命令上一個命令的返回值。
8.if語句
語法:(用于單向判斷分支)
if
list A
then
list B
fi
例子:
if?
test -s funfile
then
echo funfile exists
fi
echo hello
if 結構是一種基于命令返回值的的流程控制方式。如果測試命令的返回值為0,一個指定的命令列表就會被執行,如果用于判斷的命令返回值為非0,指定命令列表會被忽略而不被執行。
上例中表明了if結構的一個通用的格式:每一個命令列表由一個或者多個UNIX系統的shell命令組成,每個命令之間用回車符或者分號分隔,list A中最后被執行的命令決定if語句的結果。
if結構執行的過程如下所示:
1.list A命令被執行。
2.如果list A中的最后一個命令的返回值為0(真),執行list B中的命令,然后繼續執行fi以后的命令。
3.如果list A中的最后一個命令的返回值為非0(假),跳到fi并且繼續執行fi以后的命令。
test命令通常被用作流程控制,它可以使用任何的UNIX命令,因為所有的UNIX命令都產生一個返回值,以下的例子可以說明:
if
grep kingkong /etc/passwd > /dev/null
then
echo found kingkong
fi
if結構也能在程序出錯的時候提供流程控制。如下例所示:
if?
[ $# -ne 3 ]
then
echo Incorrect syntax
echo Usage: cmd arg1 arg2 arg3
exit 99
fi
9.if-else 結構
語法:(用在多分支選擇的情況)
if
list A
then
list B
else
list C
fi
例子:
if [ "$X" -lt 10 ]
then
echo X is less than 10
else
echo X is not less than 10
fi
if-else結構讓你能夠在控制命令的返回值為0的情況下執行一系列的命令,或者在控制命令的返回值為非0的情況下執行另外一系列的命令。
這種情況下if結構的執行過程是:
1.執行list A中的命令。
2.如果在list A中最后一個命令的返回值是0(真),執行list B中的命令,然后繼續執行fi以后的命令。
3.如果list A中最后一個命令的返回值為非0(假),執行list C中的命令,然后執行fi以后的命令。
注意在list C中可以包含任何的UNIX命令,其中也包括if。例如:
if?
[ "$X" -lt 10 ]
then
echo X is less than 10
else
if
[ "$X" -gt 10 ]
then
echo X is greater than 10
else
echo X is equal to 10
fi
fi
注意:每一個if必須要有一個fi來結束。
10.case結構
語法:(多路分支)
case word in
patterm1) list A
;;
pattern2) list B
;;
patternN) list N
;;
esac
例子:
case $ANS in
yes) echo O.K
;;
no) echo no go
;;
esac
if-else結構也能支持多路的分支,但是當有兩個或者三個分支的之后,程序會變得十分難以閱讀。case結構提供了實現多路分支的一種更方便的方法。分支選擇是順序地對一個word與提供的參數之間的比較結果。這些比較是是嚴格的基于字符串的對比。當一個匹配成功的時候,對應的命令就會被執行。每個命令的列表都以兩個分號結束。在完成了相關的比較之后,程序會在esac之后繼續執行下去。
word典型的情況下是指向一個shell變量。
pattern的組成格式和文件名的生成原則是一致的。
以下是一些pattern允許的特殊的字符:
* 匹配任何字符串和字符包括空字符
? 匹配任何單個的字符。
[...] 匹配任何一個括號出現中的字符
另外|字符的意義是OR。
注意:在這個結構中的右括號和分號是必須的。
case結構通常被用于菜單選擇或者是需要對幾個用戶輸入選項作出選擇的時候。
12.shell編程 - 分支:總結
返回值 每一個程序的返回值 - echo $?
數字test [ "$num1" -lt "$num2" ]
字符串test [ $string1 = $string2 ]
文件test test -f filename
exit n 終止程序的允許并且設置返回值
if case word in
command listA pattern1) command list
then ;;
command listB pattern2) command list
else ;;
command listC *) command list
fi ;;
esac
執行那個語句基于listA中最后一條 字符串word會與每一個pattern比較
命令的返回值
總結
以上是生活随笔為你收集整理的shell编程-分支语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux shell 字符串操作详解
- 下一篇: shell脚本 -d 是目录文件,那么-