shell 流程控制語句的具體使用
前言
可以說,在任何一門編程語言中都離不開流程控制語句,使用流程控制語句可以幫助程序處理各類復雜的操作,常用的流程控制語句,比如: if-else,while,for循環(huán)等,在linux 的shell 編程語法中,也提供了豐富的流程控制語句,接下來將一一做詳細的說明。
一、if - else 語句
if 語法
if 條件
then
命令
fiif - 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 輸出"優(yōu)秀"
要求5: 以上不符合輸出"成績不合法"
shell 腳本內(nèi)容
#!/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 "優(yōu)秀"
else
echo "成績不合法"
fi執(zhí)行上面的shell ,觀察輸出效果

補充說明
(())是一種數(shù)學計算命令,它除了可以進行最基本的加減乘除運算,還可以進行大于、小于、等于等關系運算,以及與、或、非邏輯運算。當 a 和 b 相等時,(( $a == $b ))判斷條件成立,進入 if,執(zhí)行 then 后邊的 echo 語句
二、case語句
shell 中case語句為多選擇語句??梢杂胏ase語句匹配一個值與一個模式,如果匹配成功,執(zhí)行相匹配的命令,當分支較多,并且判斷條件比較簡單時,使用 case in 語句就比較方便了。
case 語法結(jié)構(gòu)
case 值 in
匹配模式1)
命令1
命令2
...
;;
匹配模式2)
命令1
命令2
...
;;
*)
命令1
命令2
...
;;
esac關于case 語法的幾點補充說明
- 每一匹配模式必須以右括號結(jié)束;
- 取值可以為變量或常數(shù);
- 匹配發(fā)現(xiàn)取值符合某一模式后,其間所有命令開始執(zhí)行直至 ;;(類似break, 不可以替代否則語法報錯);
- 取值將檢測匹配的每一個模式。一旦模式匹配,則執(zhí)行完匹配模式相應命令后不再繼續(xù)其他模式。如果無一匹配模式,使用星號 * 捕獲該值,再執(zhí)行后面的命令;
- case、in 和 esac 都是 Shell 關鍵字, esac就是case的反寫在這里代表結(jié)束case;
- 匹配模式: 可以是一個數(shù)字、一個字符串,甚至是一個簡單正則表達式;
簡單正則表達式支持如下通配符
| 格式 | 說明 |
|---|---|
| * | 表示任意字符串。 |
| [abc] | 表示 a、b、c 三個字符中的任意一個。比如,[15ZH] 表示 1、5、Z、H 四個字符中的任意一個。 |
| [m-n] | 表示從 m 到 n 的任意一個字符。比如,[0-9] 表示任意一個數(shù)字,[0-9a-zA-Z] 表示字母或數(shù)字。 |
| | | 表示多重選擇,類似邏輯運算中的或運算。比如,abc | xyz 表示匹配字符串 "abc" 或者 "xyz"。 |
case 語句案例演示
#!/bin/bash
read -p "請輸入一個0~7的數(shù)字:" number
case $number in
1)
echo "星期一"
;;
2)
echo "星期二"
;;
3)
echo "星期三"
;;
4)
echo "星期四"
;;
5)
echo "星期五"
;;
6)
echo "星期六"
;;
0|7)
echo "星期日"
;;
*)
echo "您輸入的數(shù)字無效"
;;
esac執(zhí)行上面的shell腳本,觀察輸出效果

三、while 語句
while 語法
while 條件 do 命令1 命令2 ... continue; # 結(jié)束當前這一次循環(huán), 進入下一次循環(huán) break; # 結(jié)束當前循環(huán) done
一個簡單的案例
#!/bin/bash read -p "請輸入一個數(shù)字:" number i=0 while [[ $i < $number ]] do echo "hello world :" $i ((i++)) done
執(zhí)行上面的shell 腳本,觀察輸出效果

使用while語句可以實現(xiàn)無限循環(huán),寫法如下
while :
do
command
done或者下面這樣
while true
do
command
done四、until語句
until 也屬于循環(huán)結(jié)構(gòu)語句, until 循環(huán)與 while 循環(huán)在處理方式上剛好相反, 循環(huán)條件為false會一致循環(huán), 條件為true停止循環(huán)。
until 語法
條件如果返回值為1(代表false),則繼續(xù)執(zhí)行循環(huán)體內(nèi)的語句,否則跳出循環(huán)。
until 條件
do
命令
done案例演示
#!/bin/bash read -p "請輸入一個數(shù)字:" number i=0 until [[ ! $i < $number ]] do echo "hello world : " $i ((i++)) done
執(zhí)行上面的shell腳本,觀察輸出效果

五、for語句
for 語法寫法一
for var in item1 item2 ... itemN
do
命令1
命令2
...
done1、var是循環(huán)變量
2、item1 item2 ... itemN 是循環(huán)的范圍
演示案例
#!/bin/bash for i in 1 2 3 4 5 do echo "hello world :" $i done
執(zhí)行上面的腳本,觀察輸出效果

for 語法寫法二
語法結(jié)構(gòu)
for var in {start..end}
do
命令
donestart: 循環(huán)范圍的起始值,必須為整數(shù)
end: 循環(huán)范圍的結(jié)束值, 必須為整數(shù)
案例演示
#! /bin/bash
for i in {1..5}; do echo $i; done運行這段腳本,觀察輸出效果

for 語法寫法三
語法結(jié)構(gòu)
這種寫法相信做過應用端編程開發(fā)的同學更熟悉點吧
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,觀察執(zhí)行效果

無限for循環(huán)
在某些特殊的場景下,需要程序無限循環(huán)下去,可以參考下面的寫法
for((;;)); do 命令; done
六、select 語句
select in 循環(huán)用來增強交互性,它可以顯示出帶編號的菜單,用戶輸入不同的編號就可以選擇不同的菜單,并執(zhí)行不同的功。select in 是 Shell 獨有的一種循環(huán),非常適合終端(Terminal)這樣的交互場景, 其他語言沒有。
select 語法
select var in menu1 menu2 ...
do
命令
done注意:
1、select 是無限循環(huán)(死循環(huán)),輸入空值,或者輸入的值無效,都不會結(jié)束循環(huán),只有遇到 break 語句,或者按下 Ctrl+D 組合鍵才能結(jié)束循環(huán);
2、執(zhí)行命令過程中: 終端會輸出
#?代表可以輸入選擇的菜單編號;
案例演示1
#!/bin/bash
echo "你的愛好是什么?"
select hobby in "編程" "游戲" "籃球" "游泳"
do
echo $hobby
break
done
echo "你的愛好是:${hobby}"運行上面的shell觀察執(zhí)行效果

案例演示2
#!/bin/bash
echo "你的愛好是什么"
select hobby in "編程" "游戲" "籃球" "游泳"
do
case $hobby in
"編程")
echo "編程,多敲代碼"
break
;;
"游戲")
echo "少玩游戲"
break
;;
"籃球"|"游泳")
echo "運動有利健康"
break
;;
*)
echo "輸入錯誤,請重新輸入"
esac
done運行上面的shell,觀察執(zhí)行效果

接下來,補充幾個比較重要的關于shell操作中的知識點
八、文件測試 test
在使用shell編程過程中,經(jīng)常涉及到對各類文件,文件目錄的操作,比如判斷文件目錄是否存在,文件里面的內(nèi)容是否存在等,就需要用到文件測試相關的命令,下面總結(jié)的是和文件測試操作相關的語法。
| 參數(shù) | 說明 |
|---|---|
| ==-e 文件名== | exists, 如果文件存在則為真 |
| ==-r 文件名== | read,如果文件存在且可讀則為真 |
| ==-w 文件名== | write,如果文件存在且可寫則為真 |
| ==-x 文件名== | execute,如果文件存在且可執(zhí)行則為真 |
| ==-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 )、非( ! )三個邏輯操作符用于將測試條件連接起來,其優(yōu)先級為:"!"最高,"-a"次之,"-o"最低, 語法,如下:
test 條件1 -o 條件2 -a 條件3 ...
九、整數(shù)和字符串比較 test
Shell中的 test 命令用于檢查某個條件是否成立,它可以進行數(shù)值、字符和文件三個方面的測試。
功能與[]一樣。
整數(shù)比較測試
if test 數(shù)字1 options 數(shù)字2 then ... fi
options具體如下
| 參數(shù) | 說明 |
|---|---|
| -eq | 等于則為真 |
| -ne | 不等于則為真 |
| -gt | 大于則為真 |
| -ge | 大于等于則為真 |
| -lt | 小于則為真 |
| -le | 小于等于則為真 |
整數(shù)比較具體案例
#!/bin/bash
num1=1 num2=1 num3=2
echo "num1=${num1},num2=${num2},num3=${num3}"
if test $num1 -eq $num2
then
echo 'num1和num2兩個數(shù)相等!'
else
echo 'num1和num2兩個數(shù)不相等!'
fi
if test $num2 -eq $num3
then
echo 'num2和num3兩個數(shù)相等!'
else
echo 'num2和num3兩個數(shù)不相等!'
fi運行上面的shell,觀察執(zhí)行效果

字符串比較測試
語法結(jié)構(gòu)
| 參數(shù) | 說明 |
|---|---|
| = 或 == | 等于, 等于返回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執(zhí)行上面的shell,觀察輸出效果

到此這篇關于shell 流程控制語句的具體使用的文章就介紹到這了,更多相關shell 流程控制語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Shell中統(tǒng)計字符串中單詞的個數(shù)的幾種方法
今天小編就為大家分享一篇關于Shell中統(tǒng)計字符串中單詞的個數(shù)的幾種方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
linux下使用ssh遠程執(zhí)行命令批量導出數(shù)據(jù)庫到本地
這篇文章主要介紹了linux下使用ssh遠程執(zhí)行命令批量導出數(shù)據(jù)庫到本地,需要的朋友可以參考下2015-04-04

