亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 1776 | 回復(fù): 0
打印 上一主題 下一主題

bash shell if 命令參數(shù)說(shuō)明 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-01-24 09:47 |只看該作者 |倒序?yàn)g覽
摘要本章我們會(huì)討論在Bash腳本中使用條件,包含以下幾個(gè)話題: if 語(yǔ)句 使用命令的退出狀態(tài)比較和測(cè)試輸入和文件 if/then/else 結(jié)構(gòu) if/then/elif/else 結(jié)構(gòu) 使用和測(cè)試位置參數(shù)嵌套 if 語(yǔ)句 布爾表達(dá)式使用 case 語(yǔ)句
7.1. 介紹if
7.1.1. 概要 有時(shí)候你需要指定shell腳本中的依靠命令的成功與否來(lái)實(shí)施不同過(guò)程的行為。if 結(jié)構(gòu)允許你來(lái)指定這樣的條件。 最精簡(jiǎn)的 if 命令的語(yǔ)法是:
if TEST-COMMANDS; then CONSEQUENT-COMMANDS; fi TEST-COMMAND 執(zhí)行后且它的返回狀態(tài)是0,那么 CONSEQUENT-COMMANDS 就執(zhí)行。返回狀態(tài)是最后一個(gè)命令的退出狀態(tài),或者當(dāng)沒(méi)有條件是真的話為0。 TEST-COMMAND 經(jīng)常包括數(shù)字和字符串的比較測(cè)試,但是也可以是任何在成功時(shí)返回狀態(tài)0或者失敗時(shí)返回一些其他狀態(tài)的一些命令。一元表達(dá)式經(jīng)常用于檢查文件的狀態(tài)。如果對(duì) 某個(gè)要素primaries, FILE 參數(shù)是 /dev/fd/N 這樣的形式,那么就檢查文件描述符 “N”。stdin, stdout 和 stderr 和他們各自的文件描述符也可以用于測(cè)試。
7.1.1.1. 和if使用的表達(dá)式 下表包含了一個(gè)組成 TEST-COMMAND 命令或者命令列表,稱作 “要素primaries” 的概覽。這些primaries放置在方括號(hào)中來(lái)表示一個(gè)條件表達(dá)式的測(cè)試。 表 7.1. 主表達(dá)式Primary 意義
[ -a FILE ] 如果 FILE 存在則為真。
[ -b FILE ] 如果 FILE 存在且是一個(gè)塊特殊文件則為真。
[ -c FILE ] 如果 FILE 存在且是一個(gè)字特殊文件則為真。
[ -d FILE ] 如果 FILE 存在且是一個(gè)目錄則為真。
[ -e FILE ] 如果 FILE 存在則為真。
[ -f FILE ] 如果 FILE 存在且是一個(gè)普通文件則為真。
[ -g FILE ] 如果 FILE 存在且已經(jīng)設(shè)置了SGID則為真。
[ -h FILE ] 如果 FILE 存在且是一個(gè)符號(hào)連接則為真。
[ -k FILE ] 如果 FILE 存在且已經(jīng)設(shè)置了粘制位則為真。
[ -p FILE ] 如果 FILE 存在且是一個(gè)名字管道(F如果O)則為真。
[ -r FILE ] 如果 FILE 存在且是可讀的則為真。
[ -s FILE ] 如果 FILE 存在且大小不為0則為真。
[ -t FD ] 如果文件描述符 FD 打開(kāi)且指向一個(gè)終端則為真。
[ -u FILE ] 如果 FILE 存在且設(shè)置了SUID (set user ID)則為真。
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可寫(xiě)的則為真。
[ -x FILE ] 如果 FILE 存在且是可執(zhí)行的則為真。
[ -O FILE ] 如果 FILE 存在且屬有效用戶ID則為真。
[ -G FILE ] 如果 FILE 存在且屬有效用戶組則為真。
[ -L FILE ] 如果 FILE 存在且是一個(gè)符號(hào)連接則為真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read則為真。
[ -S FILE ] 如果 FILE 存在且是一個(gè)套接字則為真。
[ 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 指向相同的設(shè)備和節(jié)點(diǎn)號(hào)則為真。
[ -o OPTIONNAME ] 如果 shell選項(xiàng) “OPTIONNAME” 開(kāi)啟則為真。
[ -z STRING ] “STRING” 的長(zhǎng)度為零則為真。
[ -n STRING ] or [ STRING ] “STRING” 的長(zhǎng)度為非零 non-zero則為真。
[ STRING1 == STRING2 ] 如果2個(gè)字符串相同。 “=” may be used instead of “==” for strict POSIX compliance則為真。
[ STRING1 != STRING2 ] 如果字符串不相等則為真。
[ 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. 表達(dá)式可以借以下操作符組合起來(lái),以降序列出:listed in decreasing order of precedence: 表 7.2. 組合表達(dá)式操作 效果
[ ! EXPR ] 如果 EXPR 是false則為真。
[ ( EXPR ) ] 返回 EXPR的值。這樣可以用來(lái)忽略正常的操作符優(yōu)先級(jí)。
[ EXPR1 -a EXPR2 ] 如果 EXPR1 and EXPR2 全真則為真。
[ EXPR1 -o EXPR2 ] 如果 EXPR1 或者 EXPR2 為真則為真。 [ (或作 test) 內(nèi)建命令對(duì)條件表達(dá)式使用一系列基于參數(shù)數(shù)量的規(guī)則來(lái)求值。更多關(guān)于這個(gè)主題的信息可以在Bash文檔中查找。就像if 使用fi 來(lái)結(jié)束一樣,在條件列完之后必須用">"來(lái)結(jié)束。
7.1.1.2. 后接then語(yǔ)句的命令 CONSEQUENT-COMMANDS 列出了跟在 then 語(yǔ)句后面可以是任何有效的UNIX命令,任何可執(zhí)行的程序,任何可執(zhí)行的shell腳本或者任何shell語(yǔ)句,除了 fi. 。重要地記住 then 和 fi 在shell里面被認(rèn)為是分開(kāi)的語(yǔ)句。因此,在命令行上使用的時(shí)候,他們用分號(hào)隔開(kāi)。 在腳本中,if語(yǔ)句的不同部分通常是良好分隔的。以下是一些簡(jiǎn)單的例子:
7.1.1.3. 檢查文件 第一個(gè)例子檢查一個(gè)文件是否存在: 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選項(xiàng) 加入到你的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 環(huán)境以上的例子將在命令行輸入后開(kāi)始工作: anny ~> if [ -o noclobber ] ; then echo ; echo "your files are protected against overwriting." ; echo ; fi your files are protected against overwriting. anny ~> 然而,如果你使用依賴環(huán)境的測(cè)試,當(dāng)你在腳本中輸入相同的命令你可能得到不用的結(jié)果,因?yàn)槟_本會(huì)打開(kāi)一個(gè)新的,沒(méi)有設(shè)置預(yù)期的變量和選項(xiàng)的shell。
7.1.2. if的簡(jiǎn)單應(yīng)用
7.1.2.1. 測(cè)試退出狀態(tài) ? 變量包含了之前執(zhí)行命令的退出狀態(tài)(最近完成的前臺(tái)進(jìn)程)。 以下的例子顯示了一個(gè)簡(jiǎn)單的測(cè)試: anny ~> if [ $? -eq 0 ] More input> then echo 'That was a good job!' More input> fi That was a good job! anny ~> 以下的例子證明了 TEST-COMMANDS 可以是任何有返回和退出狀態(tài)的UNIX命令,之后 if 再次返回零的退出狀態(tài): 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 > 以下能得到同樣的結(jié)果: 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. 數(shù)字的比較 以下的例子是用了數(shù)值的比較: 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 > 這個(gè)腳本在每個(gè)星期天由cron來(lái)執(zhí)行。如果星期的數(shù)是偶數(shù),他就提醒你把垃圾箱清理: #!/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
7.1.2.3. 字符串比較 一個(gè)通過(guò)比較字符串來(lái)測(cè)試用戶ID的例子:
if [ "$(whoami)" != 'root' ]; then echo "You have no permission to run $0 as non-root user." exit 1; fi 使用Bash,你可以縮短這樣的結(jié)構(gòu)。
下面是以上測(cè)試的精簡(jiǎn)結(jié)構(gòu): [ "$(whoami)" != 'root' ] && ( echo you are using a non-privileged account; exit 1 ) 類似于如果測(cè)試為真就執(zhí)行的 “&&” 表達(dá)式, “||” 指定了測(cè)試為假就執(zhí)行。類似于 “&&” 表達(dá)式指明了在兩個(gè)測(cè)試條件為真時(shí)所采取的動(dòng)作,“||” 指明測(cè)試為假時(shí)所采取的行動(dòng)。 正則表達(dá)式也可以在比較中使用: anny > gender="female" anny > if [[ "$gender" == f* ]] More input> then echo "Pleasure to meet you, Madame."; fi Pleasure to meet you, Madame. anny > 真正的程序員多數(shù)程序員更喜歡使用和方括號(hào)相同作用的內(nèi)建的 test 命令,像這樣: test "$(whoami)" != 'root' && (echo you are using a non-privileged account; exit 1) 參見(jiàn)信息頁(yè)面得到更多關(guān)于Bash “(( EXPRESSION ))” 和 “[[ EXPRESSION ]]” 結(jié)構(gòu)的模塊匹配信息。 shell if 命令參數(shù)說(shuō)明 -b 當(dāng)file存在并且是塊文件時(shí)返回真 -c 當(dāng)file存在并且是字符文件時(shí)返回真 -d 當(dāng)pathname存在并且是一個(gè)目錄時(shí)返回真 -e 當(dāng)pathname指定的文件或目錄存在時(shí)返回真 -f 當(dāng)file存在并且是正規(guī)文件時(shí)返回真 -g 當(dāng)由pathname指定的文件或目錄存在并且設(shè)置了SGID位時(shí)返回為真 -h 當(dāng)file存在并且是符號(hào)鏈接文件時(shí)返回真,該選項(xiàng)在一些老系統(tǒng)上無(wú)效 -k 當(dāng)由pathname指定的文件或目錄存在并且設(shè)置了“粘滯”位時(shí)返回真 -p 當(dāng)file存在并且是命令管道時(shí)返回為真 -r 當(dāng)由pathname指定的文件或目錄存在并且可讀時(shí)返回為真 -s 當(dāng)file存在文件大小大于0時(shí)返回真 -u 當(dāng)由pathname指定的文件或目錄存在并且設(shè)置了SUID位時(shí)返回真 -w 當(dāng)由pathname指定的文件或目錄存在并且可執(zhí)行時(shí)返回真。一個(gè)目錄為了它的內(nèi)容被訪問(wèn)必然是可執(zhí)行的。 -o 當(dāng)由pathname指定的文件或目錄存在并且被子當(dāng)前進(jìn)程的有效用戶ID所指定的用戶擁有時(shí)返回真。
比較字符寫(xiě)法:
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-z 空串
* = 兩個(gè)字符相等
* != 兩個(gè)字符不等
* -n 非空串


本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u1/47765/showart_2158790.html
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP