shell中if-then的高級使用
在 Shell 腳本中,if-then
語句是最基本的邏輯控制結(jié)構(gòu)之一,用于根據(jù)條件執(zhí)行不同的代碼塊。以下是關(guān)于 if-then
語句的基本結(jié)構(gòu)、語法以及一些示例。
基本語法
if 條件表達(dá)式; then # 當(dāng)條件表達(dá)式為真時執(zhí)行的命令 命令1 命令2 ... else # 當(dāng)條件表達(dá)式為假時執(zhí)行的命令 命令A(yù) 命令B ... fi
詳細(xì)解釋
if
關(guān)鍵字:if
關(guān)鍵字開始一個條件判斷。
條件表達(dá)式:
- 條件表達(dá)式可以是關(guān)系表達(dá)式、邏輯表達(dá)式或其他任何形式的布爾表達(dá)式。
- 條件表達(dá)式通常放在圓括號
()
中,以提高可讀性和避免解析錯誤。
then
關(guān)鍵字:then
關(guān)鍵字表示條件表達(dá)式之后的代碼塊開始。
命令塊:
- 當(dāng)條件表達(dá)式為真時,執(zhí)行
then
后面的命令塊。
- 當(dāng)條件表達(dá)式為真時,執(zhí)行
else
關(guān)鍵字(可選):else
關(guān)鍵字表示當(dāng)條件表達(dá)式為假時執(zhí)行的代碼塊。else
塊是可選的,如果不需要處理條件為假的情況,可以省略。
fi
關(guān)鍵字:fi
關(guān)鍵字結(jié)束整個if
語句。
示例
示例 1:基本用法
#!/bin/bash # 獲取用戶輸入 read -p "請輸入一個數(shù)字: " num # 判斷數(shù)字是否大于10 if [ "$num" -gt 10 ]; then echo "數(shù)字大于10" else echo "數(shù)字小于或等于10" fi
示例 2:使用邏輯運(yùn)算符
#!/bin/bash # 獲取用戶輸入 read -p "請輸入一個數(shù)字: " num # 判斷數(shù)字是否在1到10之間 if [ "$num" -ge 1 ] && [ "$num" -le 10 ]; then echo "數(shù)字在1到10之間" else echo "數(shù)字不在1到10之間" fi
示例 3:嵌套 if-then 語句
#!/bin/bash # 獲取用戶輸入 read -p "請輸入一個數(shù)字: " num # 判斷數(shù)字是否為正數(shù)、負(fù)數(shù)還是零 if [ "$num" -gt 0 ]; then echo "數(shù)字是正數(shù)" elif [ "$num" -lt 0 ]; then echo "數(shù)字是負(fù)數(shù)" else echo "數(shù)字是零" fi
條件表達(dá)式
1. 數(shù)值比較
# 比較數(shù)值 [ "$num" -eq 10 ] # 等于 [ "$num" -ne 10 ] # 不等于 [ "$num" -gt 10 ] # 大于 [ "$num" -lt 10 ] # 小于 [ "$num" -ge 10 ] # 大于或等于 [ "$num" -le 10 ] # 小于或等于
2. 字符串比較
# 比較字符串 [ "$str" = "hello" ] # 等于 [ "$str" != "hello" ] # 不等于 [ "$str" \< "hello" ] # 字典序小于 [ "$str" \> "hello" ] # 字典序大于
3. 文件測試
# 測試文件屬性 [ -f "$file" ] # 是普通文件 [ -d "$file" ] # 是目錄 [ -r "$file" ] # 可讀 [ -w "$file" ] # 可寫 [ -x "$file" ] # 可執(zhí)行 [ -s "$file" ] # 文件非空
示例 4:文件測試
#!/bin/bash # 獲取用戶輸入的文件名 read -p "請輸入一個文件名: " filename # 測試文件是否存在且為普通文件 if [ -f "$filename" ]; then echo "文件存在且為普通文件" else echo "文件不存在或不是普通文件" fi
bash shell還提供了3個可在if-then語句中使用的高級特性。
- 在子shell中執(zhí)行命令的單括號。
- 用于數(shù)學(xué)表達(dá)式的雙括號。
- 用于高級字符串處理功能的雙方括號。
接下來將詳細(xì)描述各個特性。
使用單括號
單括號允許在if語句中使用子shell。單括號形式的test命令格式如下:
(command)
在bash shell執(zhí)行command之前,會先創(chuàng)建一個子shell,然后在其中執(zhí)行命令。如果命令成功結(jié)束,則退出狀態(tài)碼會被設(shè)為0,then部分的命令就會被執(zhí)行。如果命令的退出狀態(tài)碼不為0,則不執(zhí)行then部分的命令。來看一個使用子shell進(jìn)行測試的例子:
$ cat SingleParentheses.sh #!/bin/bash # Testing a single parentheses condition # echo $BASH_SUBSHELL # if (echo $BASH_SUBSHELL) then echo "The subshell command operated successfully." # else echo "The subshell command was NOT successful." # fi $ $ ./SinglePArentheses.sh 01 The subshell command operated successfully.
當(dāng)腳本第一次(在if語句之前)執(zhí)行echo $BASH_SUBSHELL命令時,是在當(dāng)前shell中完成的。該命令會輸出0,表明沒有使用子shell。在if語句內(nèi),腳本在子shell中執(zhí)行echo $BASH_SUBSHELL命令,該命令會輸出1,表明使用了子shell。子shell操作成功結(jié)束,接下來是執(zhí)行then部分的命令。
警告 當(dāng)你在if test語句中使用進(jìn)程列表時,可能會出現(xiàn)意料之外的結(jié)果。哪怕進(jìn)程列表中除最后一個命令之外的其他命令全都失敗,子shell仍會將退出狀態(tài)碼設(shè)為0,then部分的命令將得以執(zhí)行。
對腳本略作修改,來看一個在子shell中執(zhí)行失敗的例子:
$ cat SingleParentheses.sh #!/bin/bash # Testing a single parentheses condition # echo $BASH_SUBSHELL # if (cat /etc/PASSWORD) then echo "The subshell command operated successfully." # else echo "The subshell command was NOT successful." # fi $ $ ./SinglePArentheses.sh cat: /etc/PASSWORD: NO such file or directory The subshell command was NOT successful.
因為子shell中的命令指定了錯誤的文件名,所以退出狀態(tài)碼被設(shè)為非0。接下來則執(zhí)行else部分的命令。
使用雙括號
雙括號命令允許在比較過程中使用高級數(shù)學(xué)表達(dá)式。test命令在進(jìn)行比較的時候只能使用簡單的算術(shù)操作。雙括號命令提供了更多的數(shù)學(xué)符號,這些符號對有過其他編程語言經(jīng)驗的程序員而言并不陌生。雙括號命令的格式如下:
((expression))
expression可以是任意的數(shù)學(xué)賦值或比較表達(dá)式。除了test命令使用的標(biāo)準(zhǔn)數(shù)學(xué)運(yùn)算符,表還列出了雙括號中可用的其他運(yùn)算符。
雙括號命令符號
符號 | 描述 |
---|---|
val++ | 后增 |
val-- | 后減 |
++val | 先增 |
--val | 先減 |
! | 邏輯求反 |
~ | 位求反 |
** | 冪運(yùn)算 |
<< | 左位移 |
>> | 右位移 |
& | 位布爾AND |
| | 位布爾OR |
&& | 邏輯AND |
|| | 邏輯OR |
雙括號命令既可以在if語句中使用,也可以在腳本中的普通命令里用來賦值:
$ cat DoubleParentheses.sh #!/bin/bash # Testing a double parentheses command # val1=10 # if (( $val1 ** 2 > 90 )) then (( val2 = $val1 ** 2 )) echo "The square of $val1 is $val2," echo "which is greater than 90." # fi $ $ ./DoubleParentheses.sh The square of 10 is 100, which is greater than 90.
注意,雙括號中表達(dá)式的大于號不用轉(zhuǎn)義。這是雙括號命令又一個優(yōu)越性的體現(xiàn)。
使用雙方括號
雙方括號命令提供了針對字符串比較的高級特性。雙方括號的格式如下:
[[ expression ]]
expression可以使用test命令中的標(biāo)準(zhǔn)字符串比較。除此之外,它還提供了test命令所不具備的另一個特性——模式匹配。
注意 雙方括號在bash shell中運(yùn)行良好。不過要小心,不是所有的shell都支持雙方括號。
在進(jìn)行模式匹配時,可以定義通配符或正則表達(dá)式來匹配字符串:
$ cat DoubleBrackets.sh #!/bin/bash # Using double brackets for pattern matching # # if [[ $BASH_VERSION == 5.* ]] then echo "You are using the Bash Shell version 5 series." fi $ $ ./DoubleBrackets.sh You are using the Bash Shell version 5 series.
上述腳本中使用了雙等號(==)。雙等號會將右側(cè)的字符串(5.*)視為一個模式并應(yīng)用模式匹配規(guī)則。雙方括號命令會對$BASH_VERSION環(huán)境變量進(jìn)行匹配,看是否以字符串5.起始。如果是,則測試通過,shell會執(zhí)行then部分的命令。
總結(jié)
if-then
語句是 Shell 腳本中最基本的邏輯控制結(jié)構(gòu)之一,用于根據(jù)條件執(zhí)行不同的代碼塊。通過組合不同的條件表達(dá)式和邏輯運(yùn)算符,可以實(shí)現(xiàn)復(fù)雜的邏輯判斷。
到此這篇關(guān)于shell中if-then的高級使用的文章就介紹到這了,更多相關(guān)shell if-then內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
linux shell(.sh)腳本編寫和運(yùn)行入門
這篇文章主要介紹了linux shell(.sh)腳本編寫和運(yùn)行入門,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Shell腳本實(shí)現(xiàn)精準(zhǔn)清除Squid緩存
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)精準(zhǔn)清除Squid緩存,本文腳本是張宴同學(xué)腳本的個人優(yōu)化版,生產(chǎn)環(huán)境使用效果不錯,所以分享給大家,需要的朋友可以參考下2015-01-01Shell腳本中判斷輸入變量或者參數(shù)是否為空的方法
這篇文章主要介紹了Shell腳本中判斷輸入變量或者參數(shù)是否為空的方法,本文總結(jié)了5種方法,并分別給出了代碼實(shí)例,需要的朋友可以參考下2014-10-10Shell腳本判斷Linux系統(tǒng)是32位還是64位的幾種方法分享
這篇文章主要介紹了Shell腳本判斷Linux系統(tǒng)是32位還是64位的幾種方法分享,本文共給出了4種方法實(shí)現(xiàn)系統(tǒng)位數(shù)在判斷,需要的朋友可以參考下2014-12-12Shell腳本實(shí)現(xiàn)獲取網(wǎng)頁快照并生成縮略圖
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)獲取網(wǎng)頁快照并生成縮略圖,本文獲取網(wǎng)頁快照使用phantomjs、生成縮略圖使用ImageMagick,需要的朋友可以參考下2015-02-02Shell 命令啟動Docker Container的實(shí)現(xiàn)
本文主要介紹了Shell 命令啟動Docker Container的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02