Linux Bash腳本流程控制之「if條件判定」

2021-02-14 Linux腳本之家

在Bash Shell中,流程控制命令有兩大類:選擇和循環。屬於選擇的有:if、case;屬於循環的有:for、while、until;命令select既屬於選擇,也屬於循環。本文主要對選擇if的使用進行簡單的介紹。

Bash腳本可以由許多命令組成。每一個命令執行後,都會傳回一個結束狀態值。如果執行成功,返回0;如果執行失敗,則返回非0值。執行失敗,分為多種情況,例如:某個命令執行失敗,產生嚴重的信號n,則其結束狀態返回值為128+n。如果執行命令時,該命令不存在,則返回值為127。命令存在但沒有執行權限,則返回126。

Bash的內置變量$?用來存儲每個命令執行後傳回的狀態值。如下代碼所示:

# noexe.sh

noexe.sh: command not found

# echo $?

127

# ./noexe.sh

bash: ./noexe.sh: Permission denied

# echo $?

126

Bash的流程控制,需進行條件測試,就是以結束狀態作為真假值的判斷依據:如果結束狀態為0,則判斷為值;反之,如果結束狀態為非0值,則判斷為假。

最簡單的if條件判斷有以下兩種:

if-then

01. if 條件測試; then

02. 命令區域

03. fi

說明:如果「條件測試」為真,則執行「命令區域」的指令;否則,繼續執行fi後的下一條指令。

例如:

if (( 2 < 10 )); then

echo '真';

fi

如果2小於10的判斷為真,則顯示「真」。

if-then-else

01. if 條件測試; then

02. 命令區域1

03. else

04. 命令區域2

05. fi

說明:如果「條件測試」為真,則執行「命令區域1」的指令;否則,執行「命令區域2」的指令。

例如:

if [ -d /root/tmp ]; then

echo '/root/tmp目錄存在'

else

echo '/root/tmp目錄不存在'

fi

解釋:

行1,使用[ ]做條件測試,-d檢測/root/tmp目錄是否存在;

行2,如果判斷為真,則顯示目錄存在的信息;

行4,如果判斷為假,則顯示目錄不存在的信息。

if條件判斷的完整語法結構如下所示:

01. if 條件測試1; then

02. 命令區域1

03. elif 條件測試2; then

04. 命令區域2

05. else

06. 命令區域3

07. fi

說明:其中elif可以有多行,但是else只能有一行。「條件測試」如果和then放在同一行,需要用;隔開。條件測試1為真,則執行命令區域1的指令;條件測試2為真,則執行命令區域2的指令;否則執行命令區域3的指令。一般把「條件測試」和then寫在同一行。

示例比較代碼如下(test1.sh):

#! /bin/bash

declare -i a a

a=$1; b=$2

if (( a < b )); then

echo '$a小於$b'

elif (( a > b)); then

echo '$a大於$b'

else

echo '$a等於$b'

fi

解釋:

行2,聲明兩個整形變量a和b;

行3,變量a和b分別取值命令行參數1和2;

行4,如果a<b為真,則其結果為1,因此結束狀態傳回0;反之,傳回1。注意:(())和then之間要用;隔開,否則出現語法錯誤。

(( ))是Bash的複合命令,內置算式。((算式))可對算式的運算結果傳回真假值:如果算式的結果非0,則結束狀態傳回0,表示該算式為真;如果算式結果為0,則結束狀態傳回1,表示該算式為假。它的意義等同於:let "算式"。注意算式兩側的雙引號不可少。

if條件測試或條件判斷有多種寫法。測試結果是真是假,依據其返回值是否為0。條件測試的寫法,有以下幾種寫法:此處命令也可以是管道命令。例如:命令1|命令2|命令3,其結束狀態為最後一個命令執行的結果。

例如:

#! /bin/bash

if grep -q "rm" test1.sh; then

echo 'find rm command.'

else

echo 'not find.'

fi

說明:

其形式為:! 命令

注意:!和命令之間要有空格符隔開。

如果命令傳回值為0,則加上!之後傳回值為1;反之,如果命令傳回值為非0,則加!之後,傳回值為0。

例如上述2.1例子中,可以修改為「if ! grep -q "rm" test1.sh; then」,這樣就是如果test1.sh文件中找不到rm關鍵字,就傳回0(真值),否則傳回1(假值)。

如果算式的運算結果不為0,則傳回真值(0),否則如果運算結果為0,則返回假值(1)。

算式範例如下圖所示:


判斷式會傳回真假值,傳回0為真,傳回非0為假。

注意:[[ 的後面、 ]]的前面,都至少有一個或以上的空格符才行

例如:

#! /bin/bash

if [[ str > xyz ]]; then

echo '字符串str較大'

else

echo '字符串xyz較大'

fi

其形式為:[ 判斷式 ]

例如:

#! /bin/bash

if [ str \> xyz ]; then

echo '字符串str較大'

else

echo '字符串xyz較大'

fi

要特別注意:大於符號>對Bash而言是特殊字符,需要使用\進行轉義

用例:

[ -r filename1 -a -x filename ]

說明:如果filename1可讀可執行,則為真。-a即「且」之意。

[ -r filename1 -o -x filename ]

說明:如果filename1可讀可執行,則為真。-o即「或」之意。

形式為:命令1 && 命令2 、命令1 || 命令2。

含義分別為:&&稱為邏輯AND,如果命令1執行結果為真,才會執行命令2;如果兩個都為真,則傳回真值0,否則傳回假值1。||稱為邏輯OR,如果命令1執行結果為假,才會執行命令2,如果兩個之後有一個為真,則傳回真值0,否則傳回假值1。

小結:在上述條件測試的方法中,[[]]和[]的意思和用法相近,但是[[]]比[]使用更自由一點。因為[[]]不必擔心某些Bash特殊字符對運算符的影響。不必寫很多轉義字符。但在[]中,對於>,<,&&,||等都要使用轉義字符\進行轉義才行。除了[[]]之外,在Bash中(())也不必理會上述的特殊字符的影響。另外在[[]]中,如果使用==和!=進行比較,且在這兩個運算符右側的字符串沒有使用單引號或雙引號,則==和!=會視為對比該字符串所形成的「樣式」,如果相符,傳值為0,否則不符,傳回1。


如何關注

①複製「Linux腳本之家或LinuxSheller」,在「添加朋友」中粘貼搜索號碼關注。

②點擊微信右上角的「+」,會出現「添加朋友」,進入「查找公眾號」,輸入以下公眾號的名字,即可找到。

相關焦點

  • ...Bash | Linux 中國|linux|程式語言|bash|shell|隨機數_網易訂閱
    本文字數:2676,閱讀時長大約: 3分鐘  https://linux.cn/article-12962-1.html作者:Jim Hall譯者:Xingyu.Wang  學習一門新的程式語言是很有趣的。每當我嘗試學習一門新的語言時,我都會專注於定義變量、編寫語句和評估表達式。
  • MLSBS v0.21RC,Linux 一鍵運維腳本(新增腳本加密)
    bash script"!「MLSBS」是「My linux's bash script」的縮寫linux運維技術人員日常需要寫一堆腳本來簡化工作量。「MLSBS」的目的就是把我日常在linux下的工作通過腳本整合到一個項目中,需要的時候幾個點擊就可以完成任務了。
  • Linux——Shell腳本的應用1(基礎)
    Shell腳本的應用(基礎)簡介:隨著linux系統在企業中的應用越來越多,伺服器的自動化管理也變得越來越重要。在linux伺服器的自動化維護工作中,除了計劃任務的設置以外,shell腳本的應用也是非常重要的一部分。
  • Linux作業系統之Shell程序設計
    用Shell語言編寫的Shell程序可以使用各種變量、參數和控制結構來組織命令流程,自動化地完成各種複雜冗繁的處理工作。Linux系統中廣泛使用了Shell程序來實現系統的初啟、配置、管理和維護等工作。因此,熟練掌握Shell語言可以更加深入地理解系統的運行機制,更加有效地使用和管理系統。
  • 終極Bash腳本指南
    而 Bash 腳本是我們最容易接觸到和上手的腳本語言。這篇博客匯總一些常用的 Bash 語法,方便日後查閱學習。Hello World不管寫啥,上來先輸出個hello world。/hello.shhello world解釋器我們看到這個hello.sh 腳本,第一行有個 #!/bin/bash 。這個是用來指定該腳本在 UNIX/Linux 下執行時用到的解釋器。
  • Linux中Shell腳本基礎筆記
    shell腳本都是以"#!"作為開頭。這是腳本開始的標記,它是告訴linux系統執行該腳本文件需要使用相應的解釋器,緊挨著的/bin/bash指定了解釋器的具體路徑。shell主要用#作為注釋標記。後面可以加腳本的注釋,建議寫shell腳本要根據情況多寫注釋,便於以後腳本的維護。shell腳本的運行方式:1、可以在shell腳本第一行加上"#!/bin/bash"的話。可以按照以下方式執行:bash test.sh #要保證目錄中存在該腳本文件。2、給腳本加上可執行的權限,然後使用".
  • 【Linux】常用命令之 awk 常用實例
    ,可以在無交互的情況下實現相當複雜的文本操作,被廣泛應用於Shell腳本,完成各種自動化配置任務。awk 選項  '模式或條件 { 編輯指令 }' 文件1 文件2 … //過濾並輸出文件符合條件的內容awk  -f  腳本文件 文件1 文件2
  • Linux Bash編程超詳細語法總結
    順序執行:按命令先後順尋依次執行選擇執行:測試條件,可能會多個測試條件,某條件滿足時,則執行對應的分支循環執行:將同一段代碼反覆執行多次,因此,循環必須有退出條件;否則,則陷入死循環bash -n SHELLNAME #語法測試,測試是否存在語法錯誤bash -x SHELLNAME #模擬單步執行,顯示每一步執行過程
  • 《Bash 腳本教程》發布了
    過去三個月,我一直在寫《Bash 腳本教程》[1],現在終於寫完了。
  • Linux命令行與Shell腳本編程學習筆記20
    trap命令允許你來指定shell腳本要觀察哪些linux信號並從shell中攔截。如果腳本收到了trap命令中列出的信號,它會阻止它被shell處理,而在本地處理它。2. trap命令的格式是: trap commands signals3. 當&符放到命令後時,它會將命令和bash shell分離開來,並將它作為系統上的獨立後臺進程運行。
  • Linux常用命令 awk 入門基礎教程
    ,可以在無交互的情況下實現相當複雜的文本操作,被廣泛應用於Shell腳本,完成各種自動化配置任務。awk 選項  '模式或條件 { 編輯指令 }' 文件1 文件2 … //過濾並輸出文件符合條件的內容awk  -f  腳本文件 文件1 文件2
  • 【Linux基礎】bash shell基礎
    /home/user1/.bash_logout ---添加一條  4、>/home/user1/.bash_history這樣每次退出用戶後都會自動清空~/.bash_history中的內容 影響bash shell的其它文件,bash登錄和歡迎信息
  • Linux shell awk 流程控制語句(if,for,while,do)詳細介紹
    在linux awk的 while、do-while和for語句中允許使用break,continue語句來控制流程走向,也允許使用exit這樣的語句來退出
  • 精心匯總的 24 道 shell 腳本面試題
    示例如下所示:# chsh <用戶名> -s <新shell># chsh linuxtechi -s /bin/shQ:3 可以在shell腳本中使用哪些類型的變量?fifiQ:6 shell腳本中「$?」標記的用途是什麼?答:在寫一個shell腳本時,如果你想要檢查前一命令是否執行成功,在if條件中使用「$?」可以來檢查前一命令的結束狀態。
  • 寫出健壯的 Bash 腳本 - OSCHINA - 中文開源技術交流社區
    在寫腳本時將這類問題最小化是十分必要的。本文中我將介紹一些讓bash腳本變得健壯的技術。使用set -u你因為沒有對變量初始化而使腳本崩潰過多少次?對於我來說,很多次。好在bash提供了set -u,當你使用未初始化的變量時,讓bash自動退出。你也可以使用可讀性更強一點的set -o nounset。
  • shell腳本極簡教程
    Shell腳本和程式語言很相似,也有變量和流程控制語句,但Shell腳本是解釋執行的,不需要編譯,Shell程序從腳本中一行一行讀取並執行這些命令,相當於一個用戶把腳本中的命令一行一行敲到Shell提示符下執行。Shell初學者請注意,在平常應用中,建議不要用 root 帳號運行 Shell 。
  • 為什麼Shell腳本執行不成功?原來是這樣
    Shell腳本語言是linux系統中內置的一門非常強大的語言,非常善於處理作業系統層面的應用,我們從網上下載的很多應用的安裝和啟動往往都是用Shell腳本語言寫的。可是初步開始使用linux的小夥伴是不是經常會有些應用下載下來,不知道怎麼安裝或者啟動,甚至有的根據作者的安裝說明都操作錯誤。
  • 玩轉 Linux - shell 編程基礎
    ,使用sh或者bash,你的腳本將具有最好的環境兼容性,perl很早就是linux標配了,python這些年也成了一些linux發行版的標配,至於mac os,它默認安裝了perl、python、ruby、php、java等主流程式語言。
  • linux系統shell腳本for循環語句
    變量的值為字符串for ((i=1;i<10;i++))給變量賦一個初始值;循環的條件(條件判斷為真可以繼續循環);變量值的調整for((;;))死循環循環控制語句break打破,終止循環。實例:1、寫一個腳本,判斷192.168.18.0/24網段主機存活情況
  • CentOS「linux」學習筆記24:if和case多個條件判斷
    linux基礎操作:主要介紹了if和case判斷多個條件。";;esac表示根據參數位$1用戶輸入的參數值來判斷腳本內置需要執行的功能,輸入符合參數條件時執行對應的輸出操作,輸入所有的值都不符合時執行*)後面的語句。