shell 腳本——判斷條件

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

test命令的測試功能
node

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

1
#test -e study

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

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

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

如下是test命令經常使用的測試標誌:bash

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

-e :該「文件名」是否存在。
-d :該文件名是否爲目錄。
-f  :該文件名是否爲普通文件。
b,c,S,p,L分別指的是塊設備、字符設備、套接字文件、管道文件及連接文件。學習

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

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

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

-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.

相關文章
相關標籤/搜索