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
$?
代表上一個命令執行後的退出狀態
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