練習的小內容:
判斷當前檔案夾下是否存在a.txt檔案,若存在則建立a-1.txt檔案;否則建立t.txt檔案;
if 的三種條件運算式
1、
if 條件一;then
command1
else
command2
fi
code:
1 #!/bin/bash
2
3 if ls|grep a.txt; then
4 touch a-1.txt
5 else
6 touch t.txt
7 fi
Loong:/home/yee/if# ls
if-1.sh if-2.sh
Loong:/home/yee/if# sh -x if-1.sh
+ ls
+ grep a.txt
+ touch t.txt
Loong:/home/yee/if# ls
if-1.sh if-2.sh t.txt
Loong:/home/yee/if# touch a.txt
Loong:/home/yee/if# ls
a.txt if-1.sh if-2.sh t.txt
Loong:/home/yee/if# sh -x if-1.sh
+ ls
+ grep a.txt
a.txt
+ touch a-1.txt
Loong:/home/yee/if#
2、
if [運算式];then if與【】間要留空格,否則報錯;
command1
fi 分號 ;不能少,否則報錯:syntax error: unexpected end of file ;不要分號則then 換行寫;
更複雜的情況,則可以使用這個文法:
if [ 條件判斷式一 ]; then
當條件判斷式一成立時,可以進行的指令工作內容;
elif [ 條件判斷式二 ]; then
當條件判斷式二成立時,可以進行的指令工作內容;
else
當條件判斷式一與二均不成立時,可以進行的指令工作內容;
fi
檔案運算式
條件運算式
if [ -f file] 如果檔案存在
if [ -d... ] 如果目錄存在
if [ -s file ] 如果檔案存在且非空
if [ -r file ] 如果檔案存在且可讀
if [ -w file ] 如果檔案存在且可寫
if [ -x file ] 如果檔案存在且可執行
if [ -e dir||file] 如果指定的檔案或者目錄存在返回真
[ -z STRING ] 如果STRING的長度為零則為真
[ -n STRING ] 如果STRING的長度非零則為真
[ STRING1 = STRING2 ] 如果兩個字串相同則為真
[ STRING1 != STRING2 ] 如果字串不相同則為真
整數Variant 運算式
if [ int1 -eq int2] 如果int1等於int2
-eq -ne -lt
-nt只能用於整數,不適用於字串,字串等於用賦值號=
if [ int1 -ne int2] 如果不等於
if [ int1 -ge int2] 如果>= 整數條件運算式,大於,小於,shell裡沒有> 和<,會被當作角括弧,只有-ge,-gt,-le,lt
if [ int1 -gt int2] 如果>
if [ int1 -le int2] 如果<=
if [ int1 -lt int2] 如果<
字串Variant 運算式
If [ $a = $b]
如果string1等於string2 條件運算式引用變數要帶$,比較$a和$b,而不是比較a和b
字串允許使用賦值號做等號
if [ $string1 != $string2] 如果string1不等於string2 =放在別的地方是賦值,放在if
[ ]裡就是字串等於, =作為等於時,其兩邊都必須加空格,否則失效
if [ -n$string ] 如果string 非空(非0),返回0(true)
if [ -z $string ] 如果string
為空白
if [ $sting] 如果string非空,返回0 (和-n類似)
邏輯非! 條件運算式的相反
if [ ! 運算式 ]
if [ ! -d $num] 如果不存在目錄$num
邏輯與–a 條件運算式的並列
if [ 運算式1 –a 運算式2 ]
邏輯或-o 條件運算式的或
if [ 運算式1 –o 運算式2 ]
邏輯運算式
- 運算式與前面的= != -d –f –x -ne -eq -lt等合用
- 邏輯符號就正常的接其他運算式,沒有任何括弧( ),就是並列
if [ -z "$JHHOME" -a -d $HOME/
注意邏輯與-a與邏輯或-o很容易和其他字串或檔案的運算子號搞混
code:
1 #!/bin/bash
2
3 filename=/home/yee/if/a.txt
4 if [ -f $filename ]; then
5 touch a-1.txt
6 fi
7 if [ ! -e $filename ]; then
8 touch t.txt
9 fi
Loong:/home/yee/if# ll
總計 12
-rw-r--r-- 1 root root 75 11-07 11:42 if-1.sh
-rw-r--r-- 1 root root 130 11-07 16:08 if-2.sh
-rw-r--r-- 1 root root 38 11-07 14:21 if-3.sh
Loong:/home/yee/if# sh -x if-2.sh
+ filename=/home/yee/if/a.txt
+ '[' -f /home/yee/if/a.txt ']'
+ '[' '!' -e /home/yee/if/a.txt ']'
+ touch t.txt
Loong:/home/yee/if# ll
總計 12
-rw-r--r-- 1 root root 75 11-07 11:42 if-1.sh
-rw-r--r-- 1 root root 130 11-07 16:08 if-2.sh
-rw-r--r-- 1 root root 38 11-07 14:21 if-3.sh
-rw-r--r-- 1 root root 0 11-07 16:11 t.txt
Loong:/home/yee/if#
3、
if test 運算式 ;then
command1
fi
例:
if test $num -eq0 等價於 if [ $num –eq 0]
test 運算式,沒有 [ ]
1 #!/bin/bash 2 3 filename=/home/yee/if/a.txt 4 if test -f $filename 5 then 6 touch a-1.txt 7 else 8 touch t.txt 9 fi
Loong:/home/yee/if# ll總計 12-rw-r--r-- 1 root root 75 11-07 11:42 if-1.sh-rw-r--r-- 1 root root 130 11-07 16:08 if-2.sh-rw-r--r-- 1 root root 38 11-07 14:21 if-3.sh-rw-r--r-- 1 root root 0 11-07 16:11 t.txtLoong:/home/yee/if# sh -x if-3.sh + filename=/home/yee/if/a.txt+ test -f /home/yee/if/a.txt+ touch t.txtLoong:/home/yee/if# ll總計 12-rw-r--r-- 1 root root 75 11-07 11:42 if-1.sh-rw-r--r-- 1 root root 130 11-07 16:08 if-2.sh-rw-r--r-- 1 root root 103 11-07 16:20 if-3.sh-rw-r--r-- 1 root root 0 11-07 16:20 t.txtLoong:/home/yee/if# touch a.txtLoong:/home/yee/if# sh -x if-3.sh + filename=/home/yee/if/a.txt+ test -f /home/yee/if/a.txt+ touch a-1.txtLoong:/home/yee/if# ll總計 12-rw-r--r-- 1 root root 0 11-07 16:21 a-1.txt-rw-r--r-- 1 root root 0 11-07 16:21 a.txt-rw-r--r-- 1 root root 75 11-07 11:42 if-1.sh-rw-r--r-- 1 root root 130 11-07 16:08 if-2.sh-rw-r--r-- 1 root root 103 11-07 16:20 if-3.sh-rw-r--r-- 1 root root 0 11-07 16:20 t.txtLoong:/home/yee/if#
echo -e參數使輸出中的反斜線(\)的說明起作用
echo -n參數使引號後的內容接著輸出(不換行)