shell 流程控制語句的具體使用
前言
可以說,在任何一門編程語言中都離不開流程控制語句,使用流程控制語句可以幫助程序處理各類復雜的操作,常用的流程控制語句,比如: if-else,while,for循環等,在linux 的shell 編程語法中,也提供瞭豐富的流程控制語句,接下來將一一做詳細的說明。
一、if – else 語句
if 語法
if 條件 then 命令 fi
if – else 語法
if 條件 then 命令 else 命令 fi
if elif else 語法
if 條件1 then 命令1 elif 條件2 then 命令2 elif 條件3 then 命令3 …… else 命令N fi
接下來用一個簡單的案例完整演示下這幾種if 語法的使用
案例需求描述
提示"請輸入考試成績:" 接收用戶輸入的一個成績, 之後使用if else條件句判斷
要求1: 小於 60 輸出"不及格"
要求2: 大於等於70 並且 小於80 輸出"中等"
要求3: 大於等於80 並且 小於90 輸出"良好"
要求4: 大於等於90 並且 小於等於100 輸出"優秀"
要求5: 以上不符合輸出"成績不合法"
shell 腳本內容
#!/bin/bash read -p "請輸入考試成績:" score if (( $score < 60 )); then echo "不及格" elif (( $score >= 60 && $score < 70 )); then echo "及格" elif (( $score >= 70 && $score < 80 )); then echo "中等" elif (( $score >= 80 && $score < 90 )); then echo "良好" elif (( $score >= 90 && $score <= 100 )); then echo "優秀" else echo "成績不合法" fi
執行上面的shell ,觀察輸出效果
補充說明
(())
是一種數學計算命令,它除瞭可以進行最基本的加減乘除運算,還可以進行大於、小於、等於等關系運算,以及與、或、非邏輯運算。當 a 和 b 相等時,(( $a == $b ))
判斷條件成立,進入 if,執行 then 後邊的 echo 語句
二、case語句
shell 中case語句為多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令,當分支較多,並且判斷條件比較簡單時,使用 case in 語句就比較方便瞭。
case 語法結構
case 值 in 匹配模式1) 命令1 命令2 ... ;; 匹配模式2) 命令1 命令2 ... ;; *) 命令1 命令2 ... ;; esac
關於case 語法的幾點補充說明
- 每一匹配模式必須以右括號結束;
- 取值可以為變量或常數;
- 匹配發現取值符合某一模式後,其間所有命令開始執行直至 ;;(類似break, 不可以替代否則語法報錯);
- 取值將檢測匹配的每一個模式。一旦模式匹配,則執行完匹配模式相應命令後不再繼續其他模式。如果無一匹配模式,使用星號 * 捕獲該值,再執行後面的命令;
- case、in 和 esac 都是 Shell 關鍵字, esac就是case的反寫在這裡代表結束case;
- 匹配模式: 可以是一個數字、一個字符串,甚至是一個簡單正則表達式;
簡單正則表達式支持如下通配符
格式 | 說明 |
---|---|
* | 表示任意字符串。 |
[abc] | 表示 a、b、c 三個字符中的任意一個。比如,[15ZH] 表示 1、5、Z、H 四個字符中的任意一個。 |
[m-n] | 表示從 m 到 n 的任意一個字符。比如,[0-9] 表示任意一個數字,[0-9a-zA-Z] 表示字母或數字。 |
| | 表示多重選擇,類似邏輯運算中的或運算。比如,abc | xyz 表示匹配字符串 "abc" 或者 "xyz"。 |
case 語句案例演示
#!/bin/bash read -p "請輸入一個0~7的數字:" number case $number in 1) echo "星期一" ;; 2) echo "星期二" ;; 3) echo "星期三" ;; 4) echo "星期四" ;; 5) echo "星期五" ;; 6) echo "星期六" ;; 0|7) echo "星期日" ;; *) echo "您輸入的數字無效" ;; esac
執行上面的shell腳本,觀察輸出效果
三、while 語句
while 語法
while 條件 do 命令1 命令2 ... continue; # 結束當前這一次循環, 進入下一次循環 break; # 結束當前循環 done
一個簡單的案例
#!/bin/bash read -p "請輸入一個數字:" number i=0 while [[ $i < $number ]] do echo "hello world :" $i ((i++)) done
執行上面的shell 腳本,觀察輸出效果
使用while語句可以實現無限循環,寫法如下
while : do command done
或者下面這樣
while true do command done
四、until語句
until 也屬於循環結構語句, until 循環與 while 循環在處理方式上剛好相反, 循環條件為false會一致循環, 條件為true停止循環。
until 語法
條件如果返回值為1(代表false),則繼續執行循環體內的語句,否則跳出循環。
until 條件 do 命令 done
案例演示
#!/bin/bash read -p "請輸入一個數字:" number i=0 until [[ ! $i < $number ]] do echo "hello world : " $i ((i++)) done
執行上面的shell腳本,觀察輸出效果
五、for語句
for 語法寫法一
for var in item1 item2 ... itemN do 命令1 命令2 ... done
1、var是循環變量
2、item1 item2 … itemN 是循環的范圍
演示案例
#!/bin/bash for i in 1 2 3 4 5 do echo "hello world :" $i done
執行上面的腳本,觀察輸出效果
for 語法寫法二
語法結構
for var in {start..end} do 命令 done
start: 循環范圍的起始值,必須為整數
end: 循環范圍的結束值, 必須為整數
案例演示
#! /bin/bash for i in {1..5}; do echo $i; done
運行這段腳本,觀察輸出效果
for 語法寫法三
語法結構
這種寫法相信做過應用端編程開發的同學更熟悉點吧
for((i=start;i<=end;i++)) do 命令 done
也可以簡寫成一行
for((i=start;i<=end;i++)); do 命令; done
案例演示
#! /bin/bash for((i=0;i<=3;i++)); do echo "hello word : " $i; done
運行上面的sql,觀察執行效果
無限for循環
在某些特殊的場景下,需要程序無限循環下去,可以參考下面的寫法
for((;;)); do 命令; done
六、select 語句
select in 循環用來增強交互性,它可以顯示出帶編號的菜單,用戶輸入不同的編號就可以選擇不同的菜單,並執行不同的功。select in 是 Shell 獨有的一種循環,非常適合終端(Terminal)這樣的交互場景, 其他語言沒有。
select 語法
select var in menu1 menu2 ... do 命令 done
註意:
1、select 是無限循環(死循環),輸入空值,或者輸入的值無效,都不會結束循環,隻有遇到 break 語句,或者按下 Ctrl+D 組合鍵才能結束循環;
2、執行命令過程中: 終端會輸出
#?
代表可以輸入選擇的菜單編號;
案例演示1
#!/bin/bash echo "你的愛好是什麼?" select hobby in "編程" "遊戲" "籃球" "遊泳" do echo $hobby break done echo "你的愛好是:${hobby}"
運行上面的shell觀察執行效果
案例演示2
#!/bin/bash echo "你的愛好是什麼" select hobby in "編程" "遊戲" "籃球" "遊泳" do case $hobby in "編程") echo "編程,多敲代碼" break ;; "遊戲") echo "少玩遊戲" break ;; "籃球"|"遊泳") echo "運動有利健康" break ;; *) echo "輸入錯誤,請重新輸入" esac done
運行上面的shell,觀察執行效果
接下來,補充幾個比較重要的關於shell操作中的知識點
八、文件測試 test
在使用shell編程過程中,經常涉及到對各類文件,文件目錄的操作,比如判斷文件目錄是否存在,文件裡面的內容是否存在等,就需要用到文件測試相關的命令,下面總結的是和文件測試操作相關的語法。
參數 | 說明 |
---|---|
==-e 文件名== | exists, 如果文件存在則為真 |
==-r 文件名== | read,如果文件存在且可讀則為真 |
==-w 文件名== | write,如果文件存在且可寫則為真 |
==-x 文件名== | execute,如果文件存在且可執行則為真 |
==-s 文件名== | string,如果文件存在且至少有一個字符則為真 |
==-d 文件名== | directory,如果文件存在且為目錄則為真 |
-f 文件名 | file,如果文件存在且為普通文件則為真 |
-c 文件名 | character,如果文件存在且為字符型特殊文件則為真 |
-b 文件名 | 如果文件存在且為塊特殊文件則為真 |
案例演示
#!/bin/bash if test -w ./if.sh then echo '文件已存在並且可寫!' else echo '文件不存在或不可寫!' fi if test -e ./if.sh -a -e ./control2.sh then echo '兩個文件都存在!' else echo '可能有一個或兩個文件不存在' fi
運行上面的shell腳本,觀察輸出效果
補充說明
Shell提供瞭與( -a )、或( -o )、非( ! )三個邏輯操作符用於將測試條件連接起來,其優先級為:"!"最高,"-a"次之,"-o"最低, 語法,如下:
test 條件1 -o 條件2 -a 條件3 …
九、整數和字符串比較 test
Shell中的 test 命令用於檢查某個條件是否成立,它可以進行數值、字符和文件三個方面的測試。
功能與[]一樣。
整數比較測試
if test 數字1 options 數字2 then ... fi
options具體如下
參數 | 說明 |
---|---|
-eq | 等於則為真 |
-ne | 不等於則為真 |
-gt | 大於則為真 |
-ge | 大於等於則為真 |
-lt | 小於則為真 |
-le | 小於等於則為真 |
整數比較具體案例
#!/bin/bash num1=1 num2=1 num3=2 echo "num1=${num1},num2=${num2},num3=${num3}" if test $num1 -eq $num2 then echo 'num1和num2兩個數相等!' else echo 'num1和num2兩個數不相等!' fi if test $num2 -eq $num3 then echo 'num2和num3兩個數相等!' else echo 'num2和num3兩個數不相等!' fi
運行上面的shell,觀察執行效果
字符串比較測試
語法結構
參數 | 說明 |
---|---|
= 或 == | 等於, 等於返回0代表成功,否則返回1代表失敗 |
!= | 不等於 |
\< |
小於 |
\> |
大於 |
-z 字符串 | 字符串的長度為零則為真 |
-n 字符串 | 字符串的長度不為零則為真 |
字符串比較具體案例
#!/bin/bash str1="itheima" str2="itcast" str3="" echo "str1=${str1},str2=${str2},str3=${str3}" if test $str1 = $str2 then echo 'str1和str2兩個字符串相等' else echo 'str1和str2兩個字符串不相等' fi if test $str1 \> $str2 then echo 'str1大於str2' else echo 'str1小於str2' fi if test -z $str2 then echo "str2字符串長度為0" else echo "str2字符串長度不為0" fi if test -z $str3 then echo "str3字符串長度為0" else echo "str3字符串長度不為0" fi
執行上面的shell,觀察輸出效果
到此這篇關於shell 流程控制語句的具體使用的文章就介紹到這瞭,更多相關shell 流程控制語句內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Linux shell select菜單選擇實現代碼
- 詳解Shell if else語句的具體使用方法
- linux shell 編程之函數使用詳解
- shell腳本讀取命令行參數的實現
- 入門shell腳本基礎及原理