標籤:style blog http java 使用 strong
最精簡的
if 命令的文法是:
if TEST-COMMANDS; then CONSEQUENT-COMMANDS; fi
TEST-COMMAND 執行後且它的返回狀態是0,那麼
CONSEQUENT-COMMANDS 就執行。返回狀態是最後一個命令的退出狀態,或者當沒有條件是真的話為0。
TEST-COMMAND 經常包括數字和字串的比較測試,但是也可以是任何在成功時返回狀態0或者失敗時返回一些其他狀態的一些命令。一元運算式經常用於檢查檔案的狀態。如果對某個要素primaries,
FILE
參數是
/dev/fd/N
這樣的形式,那麼就檢查檔案描述符 “N”。
stdin
,
stdout
和
stderr
和他們各自的檔案描述符也可以用於測試。 7.1.1.1. 和if使用的運算式 下表包含了一個組成
TEST-COMMAND 命令或者命令列表,稱作 “要素primaries” 的概覽。這些primaries放置在方括弧中來表示一個條件運算式的測試。
表 7.1. 主運算式
Primary |
意義 |
[ -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 FILE2 does not則為真。 exists and |
[ 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. |
運算式可以藉以下操作符組合起來,以降序列出:listed in decreasing order of precedence:
表 7.2. 組合運算式
操作 |
效果 |
[ ! EXPR ] |
如果 EXPR 是false則為真。 |
[ ( EXPR ) ] |
返回 EXPR的值。這樣可以用來忽略正常的操作符優先順序。 |
[ EXPR1 -a EXPR2 ] |
如果 EXPR1 and EXPR2 全真則為真。 |
[ EXPR1 -o EXPR2 ] |
如果 EXPR1 或者 EXPR2 為真則為真。 |
[ (或作
test) 內建命令對條件運算式使用一系列基於參數數量的規則來求值。更多關於這個主題的資訊可以在Bash文檔中尋找。就像
if 使用
fi 來結束一樣,在條件列完之後必須用">"來結束。 7.1.1.2. 後接then語句的命令
CONSEQUENT-COMMANDS 列出了跟在
then 語句後面可以是任何有效UNIX命令,任何可執行檔程式,任何可執行檔shell指令碼或者任何shell語句,除了
fi. 。重要地記住
then 和
fi 在shell裡面被認為是分開的語句。因此,在命令列上使用的時候,他們用分號隔開。 在指令碼中,if語句的不同部分通常是良好分隔的。以下是一些簡單的例子:7.1.1.3. 檢查檔案 第一個例子檢查一個檔案是否存在:
anny ~>
cat msgcheck.sh
#!/bin/bash
echo "This scripts checks the existence of the messages file." echo "Checking..." if [ -f /var/log/messages ] then echo "/var/log/messages exists." fi echo echo "...done."
anny ~>
./msgcheck.sh This scripts checks the existence of the messages file. Checking... /var/log/messages exists.
...done.
7.1.1.4. 檢查shell選項 加入到你的Bash設定檔中去:
# These lines will print a message if the noclobber option is set:
if [ -o noclobber ] then echo "Your files are protected against accidental overwriting using redirection." fi
7.1.2.2. 數位比較
以下的例子是用了數值的比較:
anny >
num
=`wc -l work.txt`
anny >
echo $num
201
anny >
if [ "$num" -gt "150" ]
More input>
then echo ; echo "you‘ve worked hard enough for today."
More input>
echo ; fi
you‘ve worked hard enough for today.
anny >
這個指令碼在每個星期天由cron來執行。如果星期的數是偶數,他就提醒你把垃圾箱清理:
#!/bin/bash
# Calculate the week number using the date command:
WEEKOFFSET=$[ $(date +"%V") % 2 ]
# Test if we have a remainder. If not, this is an even week so send a message. # Else, do nothing.
if [ $WEEKOFFSET -eq "0" ]; then echo "Sunday evening, put out the garbage cans." | mail -s "Garbage cans out" [email protected]_domain.org
7.1.2.3. 字串比較 一個通過比較字串來測試使用者ID的例子:
if [ "$(whoami)" != ‘root‘ ]; then echo "You have no permission to run $0 as non-root user." exit 1; fi
使用Bash,你可以縮短這樣的結構。下面是以上測試的精簡結構:
[ "$(whoami)" != ‘root‘ ] && ( echo you are using a non-privileged account; exit 1 )
類似於如果測試為真就執行的 “&&” 運算式, “||” 指定了測試為假就執行。類似於 “&&” 運算式指明了在兩個測試條件為真時所採取的動作,“||” 指明測試為假時所採取的行動。 Regex也可以在比較中使用:
anny >
gender
="female"
anny >
if [[ "$gender" == f* ]]
More input>
then echo "Pleasure to meet you, Madame."
; fi Pleasure to meet you, Madame.
shell if 命令參數說明-b 當file存在並且是塊檔案時返回真
-c 當file存在並且是字元檔案時返回真
-d 當pathname存在並且是一個目錄時返回真
-e 當pathname指定的檔案或目錄存在時返回真
-f 當file存在並且是正規檔案時返回真
-g 當由pathname指定的檔案或目錄存在並且設定了SGID位時返回為真
-h 當file存在並且是符號連結檔案時返回真,該選項在一些老系統上無效
-k 當由pathname指定的檔案或目錄存在並且設定了“粘滯”位時返回真
-p 當file存在並且是命令管道時返回為真
-r 當由pathname指定的檔案或目錄存在並且可讀時返回為真
-s 當file存在檔案大小大於0時返回真
-u 當由pathname指定的檔案或目錄存在並且設定了SUID位時返回真
-w 當由pathname指定的檔案或目錄存在並且可執行時返回真。一個目錄為了它的內容被訪問必然是可執行檔。
-o 當由pathname指定的檔案或目錄存在並且被子當前進程的有效使用者ID所指定的使用者擁有時返回真。
比較字元寫法:
-eq 等於
-ne 不等於
-gt 大於
-lt 小於
-le 小於等於
-ge 大於等於
-z 空串
* = 兩個字元相等
* != 兩個字元不等
* -n 非空串