和常見(jiàn)的編程語(yǔ)言一樣,bash也支持條件判斷和循環(huán)處理等控制結(jié)構(gòu)。在bash中可以使用if、for、case、while、until等語(yǔ)句
1、if...elif...else
if 條件1; then 當(dāng)條件1為真時(shí)的處理 elif 條件2; then 當(dāng)條件2為真時(shí)的處理 elif 條件3; then 當(dāng)條件3為真時(shí)的處理 else 當(dāng)上面所有條件都為假時(shí)的處理 fi
舉例:使用cd作為判斷條件
#!/bin/bash if cd "$1"; then echo success else echo fail fi
要想在[]命令中使用特殊符號(hào),在[命令中使用''或""將它們引起來(lái),且需要在[]命令前后都插入空格
#!/bin/bash str1=abc str2=xyz if [ "$str1" '<' "$str2" ]; then ←----- 對(duì) < 進(jìn)行引用 echo 'str1 < str2' else echo 'str1 > str2' fi
2、&&||
cd ~/work && ls
如果cd該命令成功執(zhí)行,則繼續(xù)執(zhí)行l(wèi)s命令。如果由于目錄不存在等原因?qū)е耤d命令執(zhí)行失敗,那么后面的ls命令就不會(huì)被執(zhí)行.
||的含義和&&正好相反,首先執(zhí)行命令1,如果命令1的狀態(tài)碼為0以外的值,則繼續(xù)執(zhí)行命令2。也就是說(shuō),只有命令1執(zhí)行失敗了才會(huì)執(zhí)行命令2
$ file=sample.txt $ [ -e "$file" ] || touch "$file" 如果sample文件不存在(-e)則創(chuàng)建一個(gè)該文件
那么附帶了解一下文件屬性判斷,這在平常shell腳本編寫(xiě)中也是較為常見(jiàn)的:
3、[[ ]]:和[]一樣用于條件判斷
#!/bin/bash x=6 if [[ $x -gt 3 && $x -lt 7 ]]; then echo 'x > 3 AND x < 7' else echo 'x <= 3 OR x >= 7' fi
不同之處語(yǔ)法更簡(jiǎn)單,例如上面例子中在[[ ]]中可以使用&&或||代替用于進(jìn)行AND運(yùn)算或OR運(yùn)算的-a或-o。
模式匹配
對(duì)路徑展開(kāi)符號(hào)*(任意)進(jìn)行字符串比較 #!/bin/bash str1=xyz if [[ $str1 == x* ]]; then echo YES else echo NO fi
用正則表達(dá)式進(jìn)行匹配:與==類(lèi)似,=~也是一個(gè)具有模式匹配功能的運(yùn)算符,會(huì)將右邊的字符串作為擴(kuò)展正則表達(dá)式
匹配以/home/開(kāi)始,其后為/(分隔號(hào))之外的字符 #!/bin/bash str1=/home/miyake if [[ $str1 =~ ^/home/[^/]+$ ]]; then echo YES else echo NO fi
假如有對(duì)正則表達(dá)式不是很明白的話,后面打算出幾期講一下基礎(chǔ)的正則表達(dá)式,可以關(guān)注期待一波~
3、for語(yǔ)句結(jié)構(gòu)
為擴(kuò)展名是.txt的文件創(chuàng)建備份 #!/bin/bash for file in *.txt do cp "$file" "${file}.bak" done
#!/bin/bash for i in aaa bbb ccc ←----- 單詞列表設(shè)置為 aaa bbb ccc do echo $i done
在for語(yǔ)句的循環(huán)處理中,可以使用break和continue。這是bash中用于控制循環(huán)過(guò)程的內(nèi)置命令,這與C語(yǔ)言類(lèi)似。
4、case
case語(yǔ)句會(huì)使用多個(gè)模式去匹配一個(gè)字符串,并根據(jù)匹配結(jié)果執(zhí)行相應(yīng)的處理.
例如通過(guò)不同文件名匹配執(zhí)行不同命令 #!/bin/bash file="$1" case "$file" in *.txt) head "$file" ;; *.tar.gz) tar xzf "$file" ;; *) echo "not supported file : $file" ;; esac
通用模式為:
case 字符串 in 模式1) 當(dāng)匹配到模式1時(shí)的處理 ;; 模式2) 當(dāng)匹配到模式2時(shí)的處理 ;; ... esac
5、while
#!/bin/bash i=0 while [[ $i -lt 10 ]] ←----- 當(dāng) i 小于 10 時(shí)為真,因此會(huì)繼續(xù)執(zhí)行處理 do echo "$i" i=$((i + 3)) ←---------- 通過(guò)算術(shù)表達(dá)式展開(kāi)對(duì) i 加 3 done
這與用until實(shí)現(xiàn)一樣的功能
使用until語(yǔ)句將10以下的數(shù)以3為增量累加并輸出 #!/bin/bash i=0 until [[ $i -gt 10 ]] ←----- 當(dāng) i 小于等于 10 時(shí)為假,因此會(huì)繼續(xù)執(zhí)行下面的處理 do echo "$i" i=$((i + 3)) ←---------- 通過(guò)算術(shù)表達(dá)式展開(kāi)對(duì) i 加 3 done
-
編程語(yǔ)言
+關(guān)注
關(guān)注
10文章
1945瀏覽量
34757 -
字符串
+關(guān)注
關(guān)注
1文章
579瀏覽量
20529 -
命令
+關(guān)注
關(guān)注
5文章
684瀏覽量
22037 -
Shell
+關(guān)注
關(guān)注
1文章
366瀏覽量
23388 -
腳本
+關(guān)注
關(guān)注
1文章
390瀏覽量
14879
原文標(biāo)題:shell腳本基礎(chǔ)(三)控制結(jié)構(gòu)(if、for、case、while、until)
文章出處:【微信號(hào):FPGA學(xué)姐,微信公眾號(hào):FPGA學(xué)姐】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論