shell中的邏輯,流程控制語句

2021-09-26 08:49:58 字數 3620 閱讀 8557

for 迴圈語句:

用於定義迴圈執行的動作

for迴圈框架:

for name(變數) in (變數name的值)

dodone

注意:

for迴圈定義的變數只能其作用於迴圈內部

幾種定義迴圈變數(計數器)的方式:

for num in 1 2 3

# 定義num範圍1,2,3

for num in

# 定義num範圍從1到3

for num in

# 定義num範圍從3到1

for num in

# 定義num範圍從a到d

for num in `seq 1 10`

# 定義num範圍為seq命令生成的從1到10的序列

seq定義變數的優勢在於其可以定義步長:

`seq 1 2 10`篩選出10以內的奇數

(步長為2,起點為1,終點為10,從1開始每隔2取乙個值,到10為止;執行結果:1,3,5,7,9)

而大括號內部,只能定義固定的常量

應用示例:

10秒倒計時

#!/bin/bash

for sec in

do echo -n after $s is end 輸出倒計時

echo -ne "\r" 用回車換行清除(重新整理)上一行命令的輸出

sleep 1 執行完畢上面的命令,在此命令處休眠1秒,再接著迴圈

done

while迴圈,until迴圈:

(while相當於&&,條件成立時一直迴圈,直到條件不成立,結束迴圈,執行下面的命令;util相當於||,條件不成立時一直迴圈,直到成立)

while true  永遠迴圈

do 內部執行命令

done

util false 永遠迴圈

do 內部執行動作

done

if 條件判斷語句:

(1)

if 判定

then 執行

執行命令 # 判定不成功則無執行

fi 語句結束標誌

(2)if 判斷

then 執行

執行動作

elif 分支判定

then 執行

執行動作 # 兩個分支都判定不成功,無執行

fi 語句結束標誌

(3)if 判定

then 執行

執行命令

elif 分支判定

then 執行

執行命令

else # 兩個分支都判定不成功,執行else命令內容

執行命令

fi 語句結束標誌

case語句:

可以用於替代部分情況下的多分支if語句

(只能替代判定條件是變數值的匹配的if語句)

case $1 in

westos) $1匹配到westos的情況

echo linux #執行動作

;; linux) $1匹配到linux的情況

echo westos #執行動作

;; *) $1匹配不到上面的任意情況,但是一定還能匹配到萬用字元*,類似於上面的if中的else

echo linux #執行動作

esac case語句結尾

這些都是寫在乙個case語句裡面的

而不像是if語句,實際上if是乙個語句,elif是另乙個語句了。

因此使用if乙個語句乙個語句地比對,那麼當我們輸入的是最後乙個情況的話,就要比對n-1次,n-1個語句

expect自動問答語句:

自動應答器

用於建立自動應答指令碼,模擬完成系統中的互動自動應答

yum install -y expect

生成的不是shell指令碼,而是乙個expect指令碼(.exp檔案)

簡單的指令碼應用:

自動ssh連線遠端主機

#!/usr/bin/expect

set timeout 5

set ip [ lindex $ar** 0 ]

set passwd [ lindex $ar** 1 ]

spawn ssh root@ip hostname

expect

"password"

}interact

解釋:#!/usr/bin/expect 必須這樣寫,否則系統無法識別出這是乙個expect指令碼執行

set timeout 5 對於乙個問題,如果5秒內沒有反映,就跳過

set ip [ lindex $ar** 0 ] 將該expect指令碼後第一串字元作為ip變數的值(相當於是$1)

命令spawn(expect環境中的命令,不是shell中的)

spawn 是 expect 中的監控程式,其執行後會監控命令提出的互動問題

spawn /mnt/ask.sh 監控指令碼執行/mnt/ask.sh的命令

(ask.sh 提問;而本應答指令碼回答其問題,這兩個指令碼都需要有執行許可權)

(或者不給.exp檔案執行許可權,而是expect filename 執行該指令碼,就類似於sh script.sh)

expect eof 退出expect介面

interact保留互動介面(回答完了問題,留在expect中)

(其用途是在ssh等情況下,連線成功後仍然停留在連線後的介面中)

\轉義符號

\r回車符

下圖為例:

圖一中,建立乙個互動式的指令碼,演示其手動執行的操作與結果

圖三中,是expect命令的使用。

圖四中,將expect命令環境中的執行操作,寫入exp檔案即是自動應答指令碼。其執行可以使用expect filename.exp或者chmod +x filename.exp+./filename.exp

在shell指令碼中使用expect進行自動應答

由於是將兩個環境整合到一起,在寫expect內的**的時候要頂格寫,不能有縮排空格

應用示例:

自動連線172.25.254.6主機,並顯示其主機名

vim shell+ssh.exp

#!/bin/bash

auto_connect()

"password:"

}expect eof

eof}

auto_connect 172.25.254.6 hostname | tail -n 1

注意:expect環境下無法寫shell語句,如:for語句

exit 指令碼退出,程式結束

break 退出當前迴圈,進行迴圈以後的**執行

continue 提前結束本次迴圈的執行,直接進入下一次迴圈的執行

流程控制,邏輯語句

復合語句 開始,結束 程式 相對於乙個小型塊,乙個小型作用域,區域性變數生命週期在這個模組中結束 條件語句 1.if 布林表示式 語句序列 如果只有一條語句,可以省略 2.if 表示式 若干語句 else 若干語句 3.if 條件表示式1 語句序列1 else if 條件表示式2 語句序列2 els...

Shell流程控制語句

在linux shell程式設計中,if for while case等條件流程控制語句用的非常多,把這些學好,對提公升指令碼的功力有非常大的幫助。下面將逐個來講解具體的用法 if 表示式 if variable in array 語句1else 語句2fi 案例一,測試數字大小 bin sh nu...

shell流程控制語句

任何程式語言都離不開流程控制語句,其實程式設計基本上就是掌握了流程控制語句,然後加上函式 或者是方法 以及變數基本就差不多了,語法的東西很少,主要還是處理邏輯。所以,邏輯思維很重要。對於計算機來說,它只知道有或者沒有,是正或者是負,有電或者沒電,其實就是1和0的事兒。因此,if語句很重要,但又很簡單...