shell 腳本——判斷條件


在之前的shell語言學習筆記中已經寫過shell的幾種判斷語句及循環語句,也簡單的介紹了shell語言判斷語句和判斷條件。在此再做進一步學習。

test命令的測試功能

test命令用於檢測系統文件及其相關屬性,如檢查某文件是否存在,檢查某文件的權限等。判斷當前目錄下是否存在某文件study可以用以下命令:

1
#test -e study

-e 選項是測試某文件是否存在(包括文件和文件夾),該執行結果不會輸出任何信息,但是我們可以通過&&及||來改寫使其展現相關信息,改寫后的命令如下:

1
#test -e study && echo "exist!" || echo "not exist!"

該命令的作用就是當study文件存在時就輸出字符串”exist!”,當不存在時就輸出字符串”not exist!”

以下是test命令常用的測試標志:

1. 某文件名的類型檢測(存在與否及文件類型)(test -e filename)

-e :該“文件名”是否存在。
-d :該文件名是否為目錄。
-f  :該文件名是否為普通文件。
b,c,S,p,L分別指的是塊設備、字符設備、套接字文件、管道文件及鏈接文件。

2. 文件權限的檢測(test -r filename)

-r :該文件是否具有可讀屬性
-w :該文件是否具有可寫屬性
-x :該文件是否具有可執行屬性
-s  :該文件是否為非空白文件

3. 比較兩個文件(test file_a nt file_b)

-nt :文件file_a是否比file_b新
-ot :文件file_a是否比file_b舊
-ef :判斷兩個文件是否為同一文件,可用於判斷硬連接。(主要判斷兩個文件是否均指向同一個inode)

4. 兩個整數之間的判斷(test n1 -eq n2)

-eq :兩個數相等(equal)
-ne :兩個數不相等(not equal)
-gt :前者大於后者(greater than)
-lt :前者小於后者(less than)
-ge :前者大於等后者
-le :前者小於等於后者

5. 判斷字符串

test -z str :判斷字符串是否為空,若為空則回傳true
test -n str :判斷字符串是否為非空,左路為非空則回傳true(-n亦可省略)
test str_a = str_b及test str_a != str_b:判斷兩字條串是否相等及不相等。

6. 多重判斷條件(test -r file -a -w file)

-a :and,當兩個條件都滿足時才回傳true,即file具有讀和寫權限
-o : or,當兩個條件滿足其一時即回傳true
-! :條件求反,test -! -x file,即當file不具有執行權限時才回傳true

下面是兩個簡單的shell腳本,判斷其功能:

1
2
3
4
#!/bin/bash
echo "Please input a filename:"
read -e  filename
(test -e $filename && (test -d $filename && echo "directory" ||( test -f $filename && echo "regular")) )||echo "$filename does not exist"
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
echo -e "The program will show you that filename is exist which input by you."
read -p "Input a filename:" filename
test -z $filename && echo "You must input a filename." && exit 0
test ! -e $filename && echo "The filename $filename DO NOT exist" && exit 0
test -f $filename && filetype="Regulare file"
test -d $filename && filetype="directory";
test -r $filename && perm="readable"
test -w $filename && perm="$perm writable"
test -x $filename && perm="$perm executable"
echo "The filename:$filename is a $filetype"
echo "And the permission are:$perm"

使用判斷符號[ ]

可以使用判斷符號進行數據的判斷,如檢查某變量是否為空 [ -z $SHELL ],需要注意的是中括號(“[]”)內的組件必須以空格隔開。有以下腳本:

1
2
3
4
5
#!/bin/bash
read -p "input you choice:" choice
[ "$choice" == "y" ] || [ "$choice" == "Y" ] && echo "OK,continue" && exit 0
[ "$choice" == "n" ] || [ "$choice" == "N" ] && echo "Oh,interrupt!" && exit 0
echo "I don't know what is your choice" && exit 0

注:這些內容是參考的《鳥哥的Linux私房菜》一書中的部分章節。

 

二元比較操作符,比較變量或者比較數字.注意數字與字符串的區別.

整數比較

-eq 等於,如:if [ "$a" -eq "$b" ]
-ne 不等於,如:if [ "$a" -ne "$b" ]
-gt 大於,如:if [ "$a" -gt "$b" ]
-ge 大於等於,如:if [ "$a" -ge "$b" ]
-lt 小於,如:if [ "$a" -lt "$b" ]
-le 小於等於,如:if [ "$a" -le "$b" ]
< 小於(需要雙括號),如:(("$a" < "$b"))
<= 小於等於(需要雙括號),如:(("$a" <= "$b"))
> 大於(需要雙括號),如:((”$a” > “$b”))
>= 大於等於(需要雙括號),如:((”$a” >= “$b”))

字符串比較
= 等於,如:if [ "$a" = "$b" ]
== 等於,如:if [ "$a" == "$b" ],與=等價
注意:==的功能在[[]]和[]中的行為是不同的,如下:
1 [[ $a == z* ]] # 如果$a以”z”開頭(模式匹配)那么將為true
2 [[ $a == "z*" ]] # 如果$a等於z*(字符匹配),那么結果為true
3
4 [ $a == z* ] # File globbing 和word splitting將會發生
5 [ "$a" == "z*" ] # 如果$a等於z*(字符匹配),那么結果為true
一點解釋,關於File globbing是一種關於文件的速記法,比如”*.c”就是,再如~也是.
但是file globbing並不是嚴格的正則表達式,雖然絕大多數情況下結構比較像.
!= 不等於,如:if [ "$a" != "$b" ]
這個操作符將在[[]]結構中使用模式匹配.
< 小於,在ASCII字母順序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" /< "$b" ]
注意:在[]結構中"<"需要被轉義.
> 大於,在ASCII字母順序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" /> "$b" ]
注意:在[]結構中”>”需要被轉義.
具體參考Example 26-11來查看這個操作符應用的例子.
-z 字符串為”null”.就是長度為0.
-n 字符串不為”null”
注意:
使用-n在[]結構中測試必須要用”"把變量引起來.使用一個未被”"的字符串來使用! -z
或者就是未用”"引用的字符串本身,放到[]結構中。雖然一般情況下可
以工作,但這是不安全的.習慣於使用”"來測試字符串是一種好習慣.

二元比較操作符,比較變量或者比較數字.注意數字與字符串的區別.

整數比較

-eq 等於,如:if [ "$a" -eq "$b" ]
-ne 不等於,如:if [ "$a" -ne "$b" ]
-gt 大於,如:if [ "$a" -gt "$b" ]
-ge 大於等於,如:if [ "$a" -ge "$b" ]
-lt 小於,如:if [ "$a" -lt "$b" ]
-le 小於等於,如:if [ "$a" -le "$b" ]
< 小於(需要雙括號),如:(("$a" < "$b"))
<= 小於等於(需要雙括號),如:(("$a" <= "$b"))
> 大於(需要雙括號),如:((”$a” > “$b”))
>= 大於等於(需要雙括號),如:((”$a” >= “$b”))

字符串比較
= 等於,如:if [ "$a" = "$b" ]
== 等於,如:if [ "$a" == "$b" ],與=等價
注意:==的功能在[[]]和[]中的行為是不同的,如下:
1 [[ $a == z* ]] # 如果$a以”z”開頭(模式匹配)那么將為true
2 [[ $a == "z*" ]] # 如果$a等於z*(字符匹配),那么結果為true
3
4 [ $a == z* ] # File globbing 和word splitting將會發生
5 [ "$a" == "z*" ] # 如果$a等於z*(字符匹配),那么結果為true
一點解釋,關於File globbing是一種關於文件的速記法,比如”*.c”就是,再如~也是.
但是file globbing並不是嚴格的正則表達式,雖然絕大多數情況下結構比較像.
!= 不等於,如:if [ "$a" != "$b" ]
這個操作符將在[[]]結構中使用模式匹配.
< 小於,在ASCII字母順序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" /< "$b" ]
注意:在[]結構中"<"需要被轉義.
> 大於,在ASCII字母順序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" /> "$b" ]
注意:在[]結構中”>”需要被轉義.
具體參考Example 26-11來查看這個操作符應用的例子.
-z 字符串為”null”.就是長度為0.
-n 字符串不為”null”
注意:
使用-n在[]結構中測試必須要用”"把變量引起來.使用一個未被”"的字符串來使用! -z
或者就是未用”"引用的字符串本身,放到[]結構中。雖然一般情況下可
以工作,但這是不安全的.習慣於使用”"來測試字符串是一種好習慣.

 

shell中條件判斷if中的-z到-d的意思

[ -a FILE ] 如果 FILE 存在則為真。

[ -b FILE ] 如果 FILE 存在且是一個塊特殊文件則為真。

[ -c FILE ] 如果 FILE 存在且是一個字特殊文件則為真。

[ -d FILE ] 如果 FILE 存在且是一個目錄則為真。

[ -e FILE ] 如果 FILE 存在則為真。

[ -f FILE ] 如果 FILE 存在且是一個普通文件則為真。

[ -g FILE ] 如果 FILE 存在且已經設置了SGID則為真。

[ -h FILE ] 如果 FILE 存在且是一個符號連接則為真。

[ -k FILE ] 如果 FILE 存在且已經設置了粘制位則為真。

[ -p FILE ] 如果 FILE 存在且是一個名字管道(F如果O)則為真。

[ -r FILE ] 如果 FILE 存在且是可讀的則為真。

[ -s FILE ] 如果 FILE 存在且大小不為0則為真。

[ -t FD ] 如果文件描述符 FD 打開且指向一個終端則為真。

[ -u FILE ] 如果 FILE 存在且設置了SUID (set user ID)則為真。

[ -w FILE ] 如果 FILE 如果 FILE 存在且是可寫的則為真。

[ -x FILE ] 如果 FILE 存在且是可執行的則為真。

[ -O FILE ] 如果 FILE 存在且屬有效用戶ID則為真。

[ -G FILE ] 如果 FILE 存在且屬有效用戶組則為真。

[ -L FILE ] 如果 FILE 存在且是一個符號連接則為真。

[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read則為真。

[ -S FILE ] 如果 FILE 存在且是一個套接字則為真。

[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not則為真。

[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在則為真。

[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的設備和節點號則為真。

[ -o OPTIONNAME ] 如果 shell選項 “OPTIONNAME” 開啟則為真。

[ -z STRING ] “STRING” 的長度為零則為真。

[ -n STRING ] or [ STRING ] “STRING” 的長度為非零 non-zero則為真。

[ STRING1 == STRING2 ] 如果2個字符串相同。 “=” may be used instead of “==” for strict POSIX compliance則為真。

[ STRING1 != STRING2 ] 如果字符串不相等則為真。

[ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale則為真。

[ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale則為真。

[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.


免責聲明!

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



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