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

