shell的if判斷

  shell的if判斷 2012-03-16 14:53:05

分類: Python/Rubycss

 

 
1 概要
有時候你須要指定shell腳本中的依靠命令的成功與否來實施不一樣過程的行爲。 if 結構容許你來指定這樣的條件。
最精簡的 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 和他們各自的文件描述符也能夠用於測試。
1.1 和if使用的表達式
下表包含了一個組成 TEST-COMMAND 命令或者命令列表,稱做 「要素primaries」 的概覽。這些primaries放置在方括號中來表示一個條件表達式的測試。
表 1.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 若是 FILE1FILE2 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:
表 1.2. 組合表達式
操做 效果
[ ! EXPR ] 若是 EXPR 是false則爲真。
[ ( EXPR ) ] 返回 EXPR的值。這樣能夠用來忽略正常的操做符優先級。
[ EXPR1 -a EXPR2 ] 若是 EXPR1 and EXPR2 全真則爲真。
[ EXPR1 -o EXPR2 ] 若是 EXPR1 或者 EXPR2 爲真則爲真。
[ (或做 test) 內建命令對條件表達式使用一系列基於參數數量的規則來求值。更多關於這個主題的信息能夠在Bash文檔中查找。就像if 使用fi 來結束同樣,在條件列完以後必須用">"來結束。
1.2. 後接then語句的命令
CONSEQUENT-COMMANDS 列出了跟在 then 語句後面能夠是任何有效的UNIX命令,任何可執行的程序,任何可執行的shell腳本或者任何shell語句,除了 fi. 。重要地記住 then 和 fi 在shell裏面被認爲是分開的語句。所以,在命令行上使用的時候,他們用分號隔開。
在腳本中,if語句的不一樣部分一般是良好分隔的。如下是一些簡單的例子:
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.
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

[注意] 環境
以上的例子將在命令行輸入後開始工做:
anny ~> if [ -o noclobber ] ; then echo ; echo "your files are protected
against overwriting." ; echo ; fi


your files are protected against overwriting.

anny ~>
然而,若是你使用依賴環境的測試,當你在腳本中輸入相同的命令你可能獲得不用的結果,由於腳本會打開一個新的,沒有設置預期的變量和選項的shell。
1.2. if的簡單應用
1.2.1. 測試退出狀態
? 變量包含了以前執行命令的退出狀態(最近完成的前臺進程)。
如下的例子顯示了一個簡單的測試:
anny ~> if [ $? -eq 0 ]
More input> then echo 'That was a good job!'
More input> fi
That was a good job!

anny ~>
如下的例子證實了 TEST-COMMANDS 能夠是任何有返回和退出狀態的UNIX命令,以後 if 再次返回零的退出狀態:
anny ~> if ! grep $USER /etc/passwd
More input> then echo "your user account is not managed locally"; fi
your user account is not managed locally

anny > echo $?
0

anny >
如下能獲得一樣的結果:
anny > grep $USER /etc/passwd

anny > if [ $? -ne 0 ] ; then echo "not a local account" ; fi
not a local account

anny >
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" your@your_domain.org

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 )
相似於若是測試爲真就執行的 「&&」 表達式, 「||」 指定了測試爲假就執行。相似於 「&&」 表達式指明瞭在兩個測試條件爲真時所採起的動做,「||」 指明測試爲假時所採起的行動。
正則表達式也能夠在比較中使用:
anny > gender="female"

anny > if [[ "$gender" == f* ]]
More input> then echo "Pleasure to meet you, Madame."; fi
Pleasure to meet you, Madame.

anny >
[注意] 真正的程序員
多數程序員更喜歡使用和方括號相同做用的內建的 test 命令,像這樣:
test "$(whoami)" != 'root' && (echo you are using a non-privileged account; exit 1)
參見信息頁面獲得更多關於Bash 「(( EXPRESSION ))」 和 「[[ EXPRESSION ]]」 結構的模塊匹配信息。
-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   非空串


轉自:http://hi.baidu.com/caosicong/blog/item/7873e2166b8f6154f3de3280.html/cmtid/dd0b8924710a0f3c8744f986

----------------------------------------------------------------------------------------------------------------------------------------
OK,
接下來本身寫 一個 簡單的掛載硬盤腳本,mount_disk.sh(windows下的ntfs格式硬盤)

點擊(此處)摺疊或打開html

  1. #! /bin/sh
  2. dir_d=/media/disk_d
  3. dir_e=/media/disk_e
  4. dir_f=/media/disk_f
  5. a=`ls $dir_d | wc -l`
  6. b=`ls $dir_e | wc -l`
  7. c=`ls $dir_f | wc -l`
  8. echo "checking disk_d..."
  9. if [ $a -eq 0 ]; then
  10.   echo "disk_d is not exsit,now creating..."
  11.   sudo mount -t ntfs /dev/disk/by-label/software /media/disk_d
  12. else
  13.   echo "disk_d exits"
  14. fi
  15. echo "checking disk_e..."
  16. if [ $b -eq 0 ]; then
  17.   echo "disk_e is not exsit,now creating..."
  18.   sudo mount -t ntfs /dev/disk/by-label/elitor /media/disk_e
  19. else
  20.   echo "disk_e exits"
  21. fi
  22. echo "checking disk_f..."
  23. if [ $c -eq 0 ]; then
  24.   echo "disk_f is not exsit,now creating..."
  25.   sudo mount -t ntfs /dev/disk/by-label/work /media/disk_f
  26. else
  27.   echo "disk_f exits"
  28. fi
相關文章
相關標籤/搜索