使用if - then - else
語句
if - then - else
語句類似我們常用的if - else
,基本格式:
if command
then
commands
else
commands
fi
不同于if - else
的是:if - else
判斷條件是否成立依賴true
或false
,而if - then
語句依賴于if
后shell command
是否成功執行,即:命令的退出狀態碼是0
。
若是0
,則then
后的命令被執行;若不是0
,則else
后的命令被執行。fi
表示if - then - else
語句到此結束。
if - then - else
語句也可以像if - else
語句一樣嵌套使用,基本格式:
if command1
then
command set 1
elif command2
then
command set 2
elif command3
then
command set 3
elif command4
then
command set 4
fi
使用test
命令
如果需要if - then - else
語句,判斷退出狀態碼之外的條件,如:true
、false
,怎么辦?解決辦法,使用test
命令:test condition
。
關于test
命令的描述:
test
用于評估表達式,如果它評估結果為true
,則會返回退出狀態碼:0
(true
);否則,返回退出狀態碼:1
(false
);如果沒有表達式,test
命令也會返回退出狀態碼:1
(false
)。
test
與if - then - else
配合:
if test command
then
commands
else
commands
fi
關于test
的同義命令,方括號:[ ]
:
基本使用格式:
if [ condition ] then
commands
fi
注意:第一個方括號之后和第二個方括號之前必須加上一個空格, 否則就會報錯。
布爾邏輯支持:
[ condition1 ] && [ condition2 ] #與運算
[ condition1 ] || [ condition2 ] #或運算
關于test
可以判斷的三類條件:
- 數值比較
數值比較 | 描述 |
---|---|
n1 -eq n2 |
檢查n1與n2是否相等 |
n1 -ge n2 |
檢查n1是否大于等于n2 |
n1 -le n2 |
檢查n1是否小于等于n2 |
n1 -gt n2 |
檢查n1是否大于n2 |
n1 -lt n2 |
檢查n1是否小于n2 |
n1 -ne n2 |
檢查n1是否不等于n2 |
#! /bin/bash
# 控制流
var1=133
var2=145
if [ $var1 -eq $var2 ]
then
echo "$var1 等于 $var2"
elif [ $var1 -ge $var2 ]
then
echo "$var1 大于等于 $var2"
elif [ $var1 -le $var2 ]
then
echo "$var1 小于等于 $var2" #腳本輸出:133 小于等于 145
elif [ $var1 -lt $var2 ]
then
echo "$var1 小于 $var2"
elif [ $var1 -gt $var2 ]
then
echo "$var1 大于 $var2"
elif [ $var1 -ne $var2 ]
then
echo "$var1 不等于 $var2"
else
echo "不識別"
fi
exit 0
注意,在test
命令中使用浮點數會報錯:145.5: integer expression expected
,bash shell
只能處理整數。
- 字符串比較
字符串比較 | 描述 |
---|---|
str1 = str2 | 檢查str1和str2是否相等 |
str1 != str2 | 檢查str1和str2是否不相等 |
str1 > str2 | 檢查str1是否大于str2 |
str1 < str2 | 檢查str1是否小于str2 |
-n str1 | 檢查str1的長度是否非0 |
-z str1 | 檢查str1的長度是否為0 |
#! /bin/bash
# 字符串比較
var1="abc"
var2="acb"
var3=""
var4="abc"
if [ -n $var1 ];then
echo "字符串var1的長度大于0" #執行腳本輸出
fi
if [ $var2 ];then
echo "字符串var2有值"#執行腳本輸出
fi
if [ -z $var3 ];then
echo "字符串var3的長度為0"#執行腳本輸出,var3未初始化也會執行
fi
if test $var4 = $var1 ; then
echo "字符串var4=var1"#執行腳本輸出
if [ $var1 \> $var2 ]; then
echo "字符串var1 > var2"#執行腳本輸出
elif [ $var1 != $var2 ]
then
echo "字符串var1不等于var2"
else
echo "字符串var1小于var2"
fi
else
echo "字符串var4!=var1"
fi
exit 0
注意: 大于號和小于號必須轉義,否則shell
會把它們當作重定向符號,把字符串值當作文件名;大于和小于順序和sort
命令所采用的不同。
- 文件比較
文件比較 | 描述 |
---|---|
-d file |
檢查file是否存在并且是個目錄 |
-e file |
檢查file是否存在 |
-f file |
檢查file是否存在并且是個文件 |
-r file |
檢查file是否存在并且可讀 |
-w file |
檢查file是否存在并且可寫 |
-x file |
檢查file是否存在并且可執行 |
-s file |
檢查file是否存在并且非空 |
file1 -nt file2 |
檢查file1是否比file2新 |
file1 -ot file2 |
檢查file1是否比file2舊 |
-O file |
檢查file是否存在并屬當前用戶所有 |
-G file |
檢查file是否存在并且默認組與當前用戶相同 |
示例:創建一個新的目錄,新的文件,寫入腳本數據,改變文件的權限,并執行該腳本。
#! /bin/bash
#文件比較
var1="./compare"
var2="wonderful"
if [ -d $var1 ]; then
echo "${var1}目錄存在,"
if [ -f $var1/$var2 ] && [ -s $var1/$var2 ]
then
echo "${var2}文件存在,并且不為空,切換工作區"
cd ./${var1}
if [ -x $var2 ]; then
echo "文件存在,且可執行,內容如下:"
cat -n $var2
./$var2
else
echo "文件存在,不可執行,寫入腳本"
( echo "#! /bin/bash" ) > $var2
( echo "echo $(date) 執行 $var1/${var2}腳本成功??")>>$var2
echo -n "修改權限并執行結果"
chmod u+x $var2
./$var2
fi
else
echo "${var2}文件不存在或文件為空"
cd ./${var1}
if [ -e $var2 ]; then
echo "文件存在"
else
touch $var2
fi
echo "寫入'script'到文件 $var2 "
( echo "#! /bin/bash" ) > $var2
( echo "echo $(date) 執行 $var1/${var2}腳本成功??")>>$var2
echo "改變 $var2 的權限為可執行"
chmod u+x $var2
echo "執行${var2}腳本"
./${var2}
fi
else
echo "${var1}目錄不存在"
echo "創建 $var1 目錄"
mkdir $var1
echo "切換目錄"
cd $var1
echo "當前工作目錄:$PWD"
echo "創建空文件:$var2"
touch $var2
echo "寫入'script'到文件 $var2 "
( echo "#! /bin/bash" ) > $var2
( echo "echo $(date) 執行 $var1/${var2}腳本成功??")>>$var2
echo "改變 $var2 的權限為可執行"
chmod u+x $var2
echo "執行${var2}腳本"
./${var2}
fi
使用if - then - else
的高級特性
- 用于數學表達式的雙括號
- 用于高級字符串處理功能的雙方括號
雙括號
雙括號:允許在比較過程中使用高級數學表達式,而test
只支持簡單的算術比較:gt
、ge
...。
注意:可以在if語句中用雙括號命令,也可以在腳本中的普通命令里使用來賦值。
基本格式:
(( expression ))
雙括號支持的高級數學表達式:
符號 | 描述 |
---|---|
val++、++val | 后/前增 |
val--、--val | 后/前減 |
!、&&、||、 | 邏輯取反、與、或 |
~、&、|、>>、<< | 按位取反、與、或、右移、左移 |
** | 冪運算 |
示例:
#! /bin/bash
# 控制流
var=5
if (( $var ** 3 > 100 ));then
echo "雙括號的賦值操作:"
var1=$var
(( var = $var ** 3 ))
echo -n "輸出$var1 ** 3的值為: $var" #輸出5 ** 3的值為: 125
echo ""
fi
雙方括號
雙方括號:該命令針對字符串比較提供的高級特性。
基本格式:
[[ expression ]]
雙方括號里的expression
可使用test
命令中采用的標準字符串比較,同時它還使用test
命令沒有的特性:模式匹配。
模式匹配使用==
,雙等號右邊的字符串會被視為一個模式。
示例:
#! /bin/bash
# 控制流
if [[ $USER == q* ]]
then
echo "Hello $USER"
else
echo "匹配失敗"
fi
使用case
命令
case
命令采用模式匹配的方式,進行變量的匹配。
case
命令的基本格式:
case variable in
pattern1 | pattern2) #豎線操作符在一行中分隔出多個模式
commands1;;
pattern3)
commands2;;#注意必須要雙分號,這是語法的一部分
*)
default commands;
esac #結束標志
示例:
#! /bin/bash
# 控制流
case $USER in
*li|*n*)
echo "hello $USER";;
li)
echo "hi li";;
*)
echo "by";;
esac
參考資料:
Linux命令行與shell腳本編程大全