Shell中判斷各種比較

1.  關於檔案與目錄的偵測邏輯卷標!
-f  常用!偵測『檔案』是否存在 eg: if [ -f filename ]
-d  常用!偵測『目錄』是否存在
-b  偵測是否爲一個『 block 檔案』
-c  偵測是否爲一個『 character 檔案』
-S  偵測是否爲一個『 socket 標籤檔案』
-L  偵測是否爲一個『 symbolic link 的檔案』
-e  偵測『某個東西』是否存在!


2.  關於程序的邏輯卷標!
-G  偵測是否由 GID 所執行的程序所擁有
-O  偵測是否由 UID 所執行的程序所擁有
-p  偵測是否爲程序間傳送信息的 name pipe 或是 FIFO (老實說,這個不太懂!)


 

3.  關於檔案的屬性偵測!
-r  偵測是否爲可讀的屬性
-w  偵測是否爲可以寫入的屬性
-x  偵測是否爲可執行的屬性
-s  偵測是否爲『非空白檔案』
-u  偵測是否具有『 SUID 』的屬性
-g  偵測是否具有『 SGID 』的屬性
-k  偵測是否具有『 sticky bit 』的屬性


 

4.  兩個檔案之間的判斷與比較;例如[ test file1 -nt file2 ]
-nt 第一個檔案比第二個檔案新
-ot 第一個檔案比第二個檔案舊
-ef 第一個檔案與第二個檔案爲同一個檔案( link 之類的檔案)


 

5.  邏輯的『和(and)』『或(or)』
&&  邏輯的 AND 的意思
||  邏輯的 OR 的意思

運算符號    代表意義
=   等於 應用於:整型或字符串比較 如果在[] 中,只能是字符串
!=  不等於 應用於:整型或字符串比較 如果在[] 中,只能是字符串
<    小於 應用於:整型比較 在[] 中,不能使用 表示字符串 >   大於應用於:整型比較 在[] 中,不能使用 表示字符串
-eq 等於 應用於:整型比較
-ne 不等於 應用於:整型比較
-lt 小於 應用於:整型比較
-gt 大於 應用於:整型比較
-le 小於或等於 應用於:整型比較
-ge 大於或等於 應用於:整型比較
-a  雙方都成立(and) 邏輯表達式 –a 邏輯表達式
-o  單方成立(or) 邏輯表達式 –o 邏輯表達式
-z  空字符串
-n  非空字符串

 


所以你的循環條件部分寫成這樣纔是對的:
while [ "${conunter}" -lt 5 ]; do
注意在條件檢測中把變量名引起來的雙引號不能省略,這個地方如果將來是字符串的判定,沒有雙引號在某些條件下會被玩死的。所以最好養成習慣,無論是不是數值都把變量名用雙引號引起來。另外,做累加操作還有別的方法,像下面這樣:
#!/bin/ksh
counter=0
while [ "${counter}" -lt 5 ]; do
((counter++))
echo "counter is $counter"

done



for i in $(seq 0 99); do [ $i lt 10 ] && useradd student0$i || useradd student$i; done





shell中的特殊變量:
變量名
含義

$0
shell或shell腳本的名字

$*
以一對雙引號給出參數列表

$@
將各個參數分別加雙引號返回

$#
參數的個數

$_
代表上一個命令的最後一個參數

代表所在命令的PID 
 
$! 
代表最後執行的後臺命令的PID 
 
$? 
代表上一個命令執行後的退出狀態 
 
 
e.g. 
 
編輯如下test.sh腳本 
 
#!/bin/bash 
 
echo $0 
 
echo $* 
 
echo $@ 
 
echo $# 
 
echo


ls -a /home

echo $_

在terminal窗口中執行:

xk@linux:~/work> ./test.sh -a -b -c /home

./test.sh

-a -b -c /home

-a -b -c /home

4

3250

. .. fy jodier sky xk zhj

/home

xk@linux:~/work>echo $?

0

xk@linux:~/work>echo $!



xk@linux:~/work> ls -a /home &

[1] 3302

xk@linux:~/work> . .. fy jodier sky xk zhj



[1]+ Done /bin/ls $LS_OPTIONS -a /home

xk@linux:~/work> echo $!

3302

xk@linux:~/work>

爲了區別$*和$@編寫如下test.sh腳本:

#!/bin/bash

function testargs

{

echo "$# args"

}

testargs "$*"

testargs "$@"

unset -f testargs

在terminal窗口中執行:

xk@linux:~/work> ./test.sh -a -b /home

1 args

3 args

xk@linux:~/work>

這裏有一個很有意思的問題,如果test.sh爲如下的內容:

#!/bin/bash

function testargs

{

echo "$# args"

}

testargs $*

testargs $@

unset -f testargs

再次執行有:

xk@linux:~/work> ./test.sh -a -b /home

3 args

3 args
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章