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!

推薦閱讀: