免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Shell:結(jié)構(gòu)化語(yǔ)句
  • ver: 1.0
  • Blog:博客園 個(gè)人
  • 本文介紹了Shell常用的結(jié)構(gòu)化語(yǔ)句。

數(shù)組

數(shù)組(Array)是若干數(shù)據(jù)的集合,其中的每一份數(shù)據(jù)都稱為元素(Element)。

Bash只支持一維數(shù)組(不支持多維數(shù)組),初始化時(shí)不需要定義數(shù)組大小,理論上可以存放無(wú)限量的數(shù)據(jù)。

與大部分編程語(yǔ)言類似,數(shù)組元素的下標(biāo)由0開始。

Shell數(shù)組用括號(hào)來(lái)表示,元素用"空格"符號(hào)分割開。格式如下:

array_name=(ele1  ele2  ele3 ... elen)

Tips:賦值號(hào)=兩邊不能有空格,必須緊挨著數(shù)組名和數(shù)組元素。

獲取數(shù)組中的元素要使用下標(biāo)[],下標(biāo)可以是一個(gè)整數(shù),也可以是一個(gè)結(jié)果為整數(shù)的表達(dá)式;當(dāng)然,下標(biāo)必須大于等于0。格式如下:

${array_name[index]}

Tips:array_name是數(shù)組名,index是下標(biāo)。

Shell是弱類型的,它并不要求所有數(shù)組元素的類型必須相同,例如:

arr=(10 24 'ddd' 'ab22' 5)

獲取數(shù)組所有元素

使用@*可以獲取數(shù)組中的所有元素,格式如下:

${array_name[*]}
${array_name[@]}

獲取數(shù)組元素個(gè)數(shù)

使用#來(lái)獲取數(shù)組元素的個(gè)數(shù),格式如下:

${#array_name[@]}
${#array_name[*]}

數(shù)組合并

數(shù)組合并,就是將兩個(gè)或兩個(gè)以上的數(shù)組合并成一個(gè)個(gè)數(shù)組,格式如下:

array_new=(${array1[@]}  ${array2[@]}...${arrayn[@]})
array_new=(${array1[*]}  ${array2[*]}...${arrayn[*]})

刪除數(shù)組元素

使用unset關(guān)鍵字來(lái)刪除數(shù)組元素,格式如下:

unset array_name[index]

如果不寫下標(biāo),則代表刪除整個(gè)數(shù)組所有元素,格式如下:

unset array_name

實(shí)例

測(cè)試ip是否ping通

#!/usr/bin/env bash
# Author: Rohn
# Version: 1.0
# Create Time: 2020/06/13
# Test network connectivity

arr_num=(3 11 25 32 200)
for i in ${arr_num[*]}; do
  ip=192.168.110.${i}
  ping -c 1 $ip >/dev/null 2>&1
  if [ $? -eq 0 ]; then
    echo "${ip} is ok."
  else
    echo "${ip} is unreachable."
  fi
done

選擇結(jié)構(gòu)

Shell中的選擇結(jié)構(gòu)(分支結(jié)構(gòu))有兩種形式,分別是 if-elsecase-in語(yǔ)句,它們都根據(jù)命令的退出狀態(tài)來(lái)判斷條件是否成立。

if-else語(yǔ)句

基本格式

基本結(jié)構(gòu)格式:

if condition; then
  statement(s)
fi

condition是判斷條件,如果condition成立(返回True),那么then后邊的語(yǔ)句將會(huì)被執(zhí)行;如果 condition不成立(返回False),那么不會(huì)執(zhí)行任何語(yǔ)句。

Tips:最后必須以fi來(lái)閉合,fi就是if 倒過(guò)來(lái)拼寫。

if-else

如果有兩個(gè)分支,就可以使用if-else語(yǔ)句,格式:

if condition; then
  statement1
else
  statement2
fi

如果condition成立,那么then后邊的 statement1語(yǔ)句將會(huì)被執(zhí)行;否則,執(zhí)行else 后邊的statement2語(yǔ)句。

if-elif-else

當(dāng)分支比較多時(shí),可以使用if-elif-else 結(jié)構(gòu),格式:

if condition1; then
  statement1
elif condition2;then
  statement2
...
else
  statementn
fi

Tips:ifelif后邊都得跟著then。

語(yǔ)句的執(zhí)行邏輯:

  • 如果condition1成立,那么執(zhí)行statement1,如果不成立,則執(zhí)行elif語(yǔ)句;
  • 如果elif語(yǔ)句不成立,則執(zhí)行else語(yǔ)句;

case-in語(yǔ)句

當(dāng)分支較多,且判斷條件比較簡(jiǎn)單時(shí),推薦使用case-in語(yǔ)句。格式如下:

case expression in
  pattern1)
    statement1
    ;;
  pattern2)
    statement2
    ;;
  ...
  *)
    statementn
esac
  • expression表示表達(dá)式,既可以是一個(gè)變量、一個(gè)數(shù)字、一個(gè)字符串,還可以是一個(gè)數(shù)學(xué)計(jì)算表達(dá)式,或者是命令的執(zhí)行結(jié)果,只要能夠得到expression的值就可以。
  • pattern表示匹配模式,可以是一個(gè)數(shù)字、一個(gè)字符串,甚至是一個(gè)簡(jiǎn)單的正則表達(dá)式。

case會(huì)將expression的值與 pattern1、pattern2...patternn逐個(gè)進(jìn)行匹配:

  • 如果expression和某個(gè)模式(比如 pattern2)匹配成功,就會(huì)執(zhí)行這模式(比如 pattern2)后面對(duì)應(yīng)的所有語(yǔ)句(該語(yǔ)句可以有一條,也可以有多條),直到遇見雙分號(hào);;才停止;然后整個(gè)case-in語(yǔ)句就執(zhí)行完了,程序會(huì)跳出整個(gè) case-in語(yǔ)句,執(zhí)行esac后面的其它語(yǔ)句。
  • 如果 expression 沒有匹配到任何一個(gè)模式,那么就執(zhí)行*)后面的語(yǔ)句(*表示其它所有值),直到遇見雙分號(hào);;或者esac才結(jié)束。*)相當(dāng)于多個(gè)if分支語(yǔ)句中最后的else部分。

Tips:分支*)并不是什么語(yǔ)法規(guī)定,它只是一個(gè)正則表達(dá)式,*表示任意字符串,所以不管expression的值是什么,*)總能匹配成功。因此,可以沒有*)部分,如果expression沒有匹配到任何一個(gè)模式,那么就不執(zhí)行任何操作。

除最后一個(gè)分支外(這個(gè)分支可以是普通分支,也可以是*)分支),其它的每個(gè)分支都必須以;;結(jié)尾,;;代表一個(gè)分支的結(jié)束,不寫的話會(huì)有語(yǔ)法錯(cuò)誤。最后一個(gè)分支可以寫;;,也可以不寫,因?yàn)闊o(wú)論如何,執(zhí)行到esac都會(huì)結(jié)束整個(gè)case-in語(yǔ)句。

case-inpattern部分支持簡(jiǎn)單的正則表達(dá)式,具體來(lái)說(shuō),可以使用以下幾種格式:

格式 說(shuō)明
* 表示任意字符串。
[abc] 表示 a、b、c 三個(gè)字符中的任意一個(gè)。比如,[15ZH] 表示 1、5、Z、H 四個(gè)字符中的任意一個(gè)。
[m-n] 表示從 m 到 n 的任意一個(gè)字符。比如,[0-9] 表示任意一個(gè)數(shù)字,[0-9a-zA-Z] 表示字母或數(shù)字。
| 表示多重選擇,類似邏輯運(yùn)算中的或運(yùn)算。比如,abc | xyz 表示匹配字符串 "abc" 或者 "xyz"。

;;&終止每個(gè)條件塊,例如:

read -n 1 -p "Type a character > "
echo
case $REPLY in
  [[:upper:]])    echo "'$REPLY' is upper case." ;;&
  [[:lower:]])    echo "'$REPLY' is lower case." ;;&
  [[:alpha:]])    echo "'$REPLY' is alphabetic." ;;&
  [[:digit:]])    echo "'$REPLY' is a digit." ;;&
  [[:graph:]])    echo "'$REPLY' is a visible character." ;;&
  [[:punct:]])    echo "'$REPLY' is a punctuation symbol." ;;&
  [[:space:]])    echo "'$REPLY' is a whitespace character." ;;&
  [[:xdigit:]])   echo "'$REPLY' is a hexadecimal digit." ;;&
esac

輸出結(jié)果如下:

Type a character > a
'a' is lower case.
'a' is alphabetic.
'a' is a visible character.
'a' is a hexadecimal digit.

循環(huán)結(jié)構(gòu)

循環(huán)結(jié)構(gòu)語(yǔ)句大致分為4種:

  • while
  • until
  • for
  • select

while語(yǔ)句

當(dāng)條件滿足時(shí),while重復(fù)地執(zhí)行一組語(yǔ)句,當(dāng)條件不滿足時(shí),就退出while循環(huán)。格式如下:

while condition; do
  statements
done

執(zhí)行流程如下:

  • 先對(duì)condition進(jìn)行判斷,如果該條件成立,就進(jìn)入循環(huán),執(zhí)while循環(huán)體中的語(yǔ)句,也就是dodone之間的語(yǔ)句。這樣就完成了一次循環(huán)。
  • 每一次執(zhí)行到done的時(shí)候都會(huì)重新判斷condition是否成立,如果成立,就進(jìn)入下一次循環(huán),繼續(xù)執(zhí)行dodone之間的語(yǔ)句,如果不成立,就結(jié)束整個(gè)while循環(huán),執(zhí)行done后面的其它Shell代碼。
  • 如果一開始condition就不成立,那么程序就不會(huì)進(jìn)入循環(huán)體。

死循環(huán)

格式一:

while true; do
  statements
done

格式二:

while [ 1 ]; do
  statements
done

until語(yǔ)句

until循環(huán)當(dāng)判斷條件不成立時(shí)才進(jìn)行循環(huán),一旦判斷條件成立,就終止循環(huán)。

until condition; do
  statements
done

until循環(huán)的執(zhí)行流程為:

  • 先對(duì)condition進(jìn)行判斷,如果該條件不成立,就進(jìn)入循環(huán),執(zhí)行until循環(huán)體中的語(yǔ)句(dodone之間的語(yǔ)句),這樣就完成了一次循環(huán)。
  • 每一次執(zhí)行到done的時(shí)候都會(huì)重新判斷condition是否成立,如果不成立,就進(jìn)入下一次循環(huán),繼續(xù)執(zhí)行循環(huán)體中的語(yǔ)句,如果成立,就結(jié)束整個(gè) until循環(huán),執(zhí)行done后面的其它Shell代碼。

for語(yǔ)句

C語(yǔ)言風(fēng)格的 for 循環(huán)

格式如下:

for((exp1; exp2; exp3)); do
  statements
done

exp1、exp2exp3是三個(gè)表達(dá)式,其中exp2是判斷條件,for循環(huán)根據(jù)exp2的結(jié)果來(lái)決定是否繼續(xù)下一次循環(huán);

它的運(yùn)行過(guò)程為:

  1. 先執(zhí)行exp1。
  2. 再執(zhí)行exp2,如果它的判斷結(jié)果是成立的,則執(zhí)行循環(huán)體中的語(yǔ)句,否則結(jié)束整個(gè)for循環(huán)。
  3. 執(zhí)行完循環(huán)體后再執(zhí)行exp3。
  4. 重復(fù)執(zhí)行2、3步驟,直到exp2的判斷結(jié)果不成立,就結(jié)束循環(huán)。

for-in循環(huán)

格式如下:

for variable in value_list; do
  statements
done

variable表示變量,value_list表示取值列表。

每次循環(huán)都會(huì)從value_list中取出一個(gè)值賦給變量 variable,然后進(jìn)入循環(huán)體(dodone之間的部分),執(zhí)行循環(huán)體中的statements。直到取完value_list中的所有值,循環(huán)就結(jié)束了。

value_list

  • 具體的值,例如:
for i in 1 2 3 'dd';do echo $i;done
  • {start..end},例如:
# 求1到10的和
sum=0
for i in {1..10}; do
  sum=$((sum+i))
done
echo $sum
  • 命令的執(zhí)行結(jié)果,例如:
# 求100以內(nèi)偶數(shù)的和
for i in $(seq 2 2 100); do
  sum=$((sum+i))
done
echo $sum
  • 通配符,例如:
# 打印當(dāng)前路徑.log結(jié)尾的文件
for i in *.log; do echo $i;done

Tips:若當(dāng)前路徑無(wú).log結(jié)尾的文件,則會(huì)打印*.log

  • 特殊變量,$*、$@等,例如:
for i in $@; do
  sum=$((sum+i))
done
echo $sum

select-in語(yǔ)句

select-in循環(huán)用來(lái)增強(qiáng)交互性,它可以顯示出帶編號(hào)的菜單,用戶輸入不同的編號(hào)就可以選擇不同的菜單,并執(zhí)行不同的功能,非常適合終端(Terminal)這樣的交互場(chǎng)景。格式如下:

select variable in value_list; do
  statements
done

variable表示變量,value_list表示取值列表。

例如:

echo "選擇你要學(xué)習(xí)的科目:"
select i in 'Linux' 'Python' 'Java' 'C++' 'PHP'; do
  echo "你選擇了${i}。"
done

結(jié)果如下:

選擇你要學(xué)習(xí)的科目:
1) Linux
2) Python
3) Java
4) C++
5) PHP
#? 5
你選擇了PHP。
#? 2
你選擇了Python。
#? 666
你選擇了。

Tips:select是死循環(huán),輸入空值或者輸入的值無(wú)效,都不會(huì)結(jié)束循環(huán),只有遇到break語(yǔ)句,或者按下Ctrl+D組合鍵才能結(jié)束循環(huán)。

例如:

echo "選擇你要學(xué)習(xí)的科目:"
select i in 'Linux' 'Python' 'Java' 'C++' 'PHP'; do
  echo "你選擇了${i}。"
  break
done

結(jié)果如下:

選擇你要學(xué)習(xí)的科目:
1) Linux
2) Python
3) Java
4) C++
5) PHP
#? 5
你選擇了PHP。

select-in語(yǔ)句常和case-in語(yǔ)句一起使用。

break

格式如下:

break n

n表示跳出循環(huán)的層數(shù),如果省略n,則表示跳出當(dāng)前。

continue

格式如下:

continue n

n表示循環(huán)的層數(shù):

  • 如果省略n,則表示continue只對(duì)當(dāng)前層次的循環(huán)語(yǔ)句有效,遇到continue會(huì)跳過(guò)本次循環(huán),忽略本次循環(huán)的剩余代碼,直接進(jìn)入下一次循環(huán)。
  • 如果帶上n,比如n的值為2,那么continue 對(duì)內(nèi)層和外層循環(huán)語(yǔ)句都有效,不但內(nèi)層會(huì)跳過(guò)本次循環(huán),外層也會(huì)跳過(guò)本次循環(huán),其效果相當(dāng)于內(nèi)層循環(huán)和外層循環(huán)同時(shí)執(zhí)行了不帶ncontinue。

break的區(qū)別:

  • break用來(lái)結(jié)束當(dāng)前整個(gè)循環(huán);
  • continue用來(lái)結(jié)束本次循環(huán),直接跳到下一次循環(huán),如果循環(huán)條件成立,還會(huì)繼續(xù)循環(huán);

函數(shù)

函數(shù)的本質(zhì)是一段可以重復(fù)使用的腳本代碼,這段代碼被提前編寫好了,放在了指定的位置,使用時(shí)直接調(diào)取即可。

函數(shù)定義

格式如下:

function func_name() {
    statements
    [return value]
}

Tips:關(guān)鍵詞function是可選的,但必須在一個(gè)項(xiàng)目中保持一致。

說(shuō)明:

  • function是Shell中的關(guān)鍵字,專門用來(lái)定義函數(shù),可以不寫,但要求在整個(gè)項(xiàng)目腳本中保持一致,即統(tǒng)一不寫或都寫;
  • func_name是函數(shù)名,按照約定規(guī)范,函數(shù)名后面必須帶上();
  • statements是函數(shù)要執(zhí)行的代碼,也就是一組語(yǔ)句;
  • return value表示函數(shù)的返回值,其中return 是Shell關(guān)鍵字,專門用在函數(shù)中返回一個(gè)值;這一部分可以寫也可以不寫。

函數(shù)調(diào)用

調(diào)用Shell函數(shù)時(shí)可以給它傳遞參數(shù),也可以不傳遞。如果不傳遞參數(shù),直接給出函數(shù)名字即可,格式如下:

func_name

如果傳遞參數(shù),那么多個(gè)參數(shù)之間以空格分隔:

func_name param1 param2 param3...

Tips:不管是哪種調(diào)用方式,函數(shù)名字后面都不需要帶()

函數(shù)參數(shù)

函數(shù)參數(shù)是Shell位置參數(shù)的一種,在函數(shù)內(nèi)部可以使用$n來(lái)接收,例如,$1表示第一個(gè)參數(shù),$2表示第二個(gè)參數(shù),依次類推。

除了$n,還有另外三個(gè)比較重要的變量:

  • $#可以獲取傳遞的參數(shù)的個(gè)數(shù);
  • $@或者$*可以一次性獲取所有的參數(shù)
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
萬(wàn)字總結(jié) | 完全掌握Shell編程
Shell編程中的數(shù)組定義、遍歷 | 四號(hào)程序員
第7章 shell程序設(shè)計(jì)
十天學(xué)會(huì)PHP/第四天:數(shù)組、函數(shù)、表單
編寫 Bash 腳本所需知道的一切
shell入門基礎(chǔ)(6)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服