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塊是可選的,如果不需要處理?xiàng)l件為假的情況,可以省略。
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 "文件不存在或不是普通文件"
fibash 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.因?yàn)樽觭hell中的命令指定了錯誤的文件名,所以退出狀態(tài)碼被設(shè)為非0。接下來則執(zhí)行else部分的命令。
使用雙括號
雙括號命令允許在比較過程中使用高級數(shù)學(xué)表達(dá)式。test命令在進(jìn)行比較的時候只能使用簡單的算術(shù)操作。雙括號命令提供了更多的數(shù)學(xué)符號,這些符號對有過其他編程語言經(jīng)驗(yàn)的程序員而言并不陌生。雙括號命令的格式如下:
((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-09
Shell腳本實(shí)現(xiàn)精準(zhǔn)清除Squid緩存
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)精準(zhǔn)清除Squid緩存,本文腳本是張宴同學(xué)腳本的個人優(yōu)化版,生產(chǎn)環(huán)境使用效果不錯,所以分享給大家,需要的朋友可以參考下2015-01-01
Shell腳本中判斷輸入變量或者參數(shù)是否為空的方法
這篇文章主要介紹了Shell腳本中判斷輸入變量或者參數(shù)是否為空的方法,本文總結(jié)了5種方法,并分別給出了代碼實(shí)例,需要的朋友可以參考下2014-10-10
Shell腳本判斷Linux系統(tǒng)是32位還是64位的幾種方法分享
這篇文章主要介紹了Shell腳本判斷Linux系統(tǒng)是32位還是64位的幾種方法分享,本文共給出了4種方法實(shí)現(xiàn)系統(tǒng)位數(shù)在判斷,需要的朋友可以參考下2014-12-12
Shell腳本實(shí)現(xiàn)獲取網(wǎng)頁快照并生成縮略圖
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)獲取網(wǎng)頁快照并生成縮略圖,本文獲取網(wǎng)頁快照使用phantomjs、生成縮略圖使用ImageMagick,需要的朋友可以參考下2015-02-02
Shell 命令啟動Docker Container的實(shí)現(xiàn)
本文主要介紹了Shell 命令啟動Docker Container的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02

