SHELL中的循環(huán):

循環(huán):for, while, until

? ? ? ? 循環(huán)體:要執(zhí)行的代碼;可能要執(zhí)行n遍;

? ? ? ? ? ? 進(jìn)入條件:

? ? ? ? ? ? 退出條件:

? ? ? ? for循環(huán):

? ? ? ? ? ? for 變量名? in 列表; do

? ? ? ? ? ? ? ? 循環(huán)體

? ? ? ? ? ? done

? ? ? ? ? ? 執(zhí)行機(jī)制:

? ? ? ? ? ? ? ? 依次將列表中的元素賦值給“變量名”; 每次賦值后即執(zhí)行一次循環(huán)體; 直到列表中的元素耗盡,循環(huán)結(jié)束;

? ? ? ? ? ? 示例:添加10個(gè)用戶, user1-user10;密碼同用戶名;

? ? ? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? ? ? #

? ? ? ? ? ? ? ? if [ ! $UID -eq 0 ]; then

? ? ? ? ? ? ? ? ? ? echo "Only root."

? ? ? ? ? ? ? ? ? ? exit 1

? ? ? ? ? ? ? ? fi

? ? ? ? ? ? ? ? for i in {1..10}; do

? ? ? ? ? ? ? ? ? ? if id user$i &> /dev/null; then

? ? ? ? ? ? ? ? ? ? ? echo "user$i exists."

? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? useradd user$i

? ? ? ? ? ? ? ? ? ? if [ $? -eq 0 ]; then

? ? ? ? ? ? ? ? ? ? ? ? echo "user$i" | passwd --stdin user$i &> /dev/null

? ? ? ? ? ? ? ? ? ? ? ? ? ? echo "Add user$i finished."

? ? ? ? ? ? ? ? ? ? ? ? fi

? ? ? ? ? ? ? ? ? ? fi

? ? ? ? ? ? ? ? done

? ? ? ? ? ? 列表生成方式:

? ? ? ? ? ? ? ? (1) 直接給出列表;

? ? ? ? ? ? ? ? (2) 整數(shù)列表:

? ? ? ? ? ? ? ? ? ? (a) {start..end}

? ? ? ? ? ? ? ? ? ? (b) $(seq [start [step]] end)

? ? ? ? ? ? ? ? (3) 返回列表的命令;

? ? ? ? ? ? ? ? ? ? $(COMMAND)

? ? ? ? ? ? ? ? (4) glob

? ? ? ? ? ? ? ? (b) 變量引用;

? ? ? ? ? ? ? ? ? ? $@, $*

? ? ? ? ? ? 示例:判斷某路徑下所有文件的類型

? ? ? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? ? ? #

? ? ? ? ? ? ? ? for file in $(ls /var); do

? ? ? ? ? ? ? ? ? ? if [ -f /var/$file ]; then

? ? ? ? ? ? ? ? ? ? echo "Common file."

? ? ? ? ? ? ? ? ? ? elif [ -L /var/$file ]; then

? ? ? ? ? ? ? ? ? ? echo "Symbolic file."

? ? ? ? ? ? ? ? ? ? elif [ -d /var/$file ]; then

? ? ? ? ? ? ? ? ? ? echo "Directory."

? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? echo "Other type."

? ? ? ? ? ? ? ? ? ? fi

? ? ? ? ? ? ? ? done? ? ? ? ? ?

? ? ? ? ? ? 示例:

? ? ? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? ? ? #

? ? ? ? ? ? ? ? declare -i estab=0

? ? ? ? ? ? ? ? declare -i listen=0

? ? ? ? ? ? ? ? declare -i other=0

? ? ? ? ? ? ? ? for state in $( netstat -tan | grep "^tcp\>" | awk '{print $NF}'); do

? ? ? ? ? ? ? ? ? ? if [ "$state" == 'ESTABLISHED' ]; then

? ? ? ? ? ? ? ? ? ? let estab++

? ? ? ? ? ? ? ? ? ? elif [ "$state" == 'LISTEN' ]; then

? ? ? ? ? ? ? ? ? ? let listen++

? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? let other++

? ? ? ? ? ? ? ? ? ? fi

? ? ? ? ? ? ? ? done

? ? ? ? ? ? ? ? echo "ESTABLISHED: $estab"

? ? ? ? ? ? ? ? echo "LISTEN: $listen"

? ? ? ? ? ? ? ? echo "Unkown: $other"? ? ? ? ? ? ? ?

? ? 練習(xí)1:/etc/rc.d/rc3.d目錄下分別有多個(gè)以K開(kāi)頭和以S開(kāi)頭的文件;

? ? ? ? 分別讀取每個(gè)文件,以K開(kāi)頭的文件輸出為文件加stop,以S開(kāi)頭的文件輸出為文件名加start;

? ? ? ? ? ? “K34filename stop”

? ? ? ? ? ? “S66filename start”

? ? 練習(xí)2:寫一個(gè)腳本,使用ping命令探測(cè)172.16.250.1-254之間的主機(jī)的在線狀態(tài);

for循環(huán)語(yǔ)法:

? ? ? ? for NAME in LIST; do

? ? ? ? ? ? 循環(huán)體

? ? ? ? done

? ? ? ? 列表生成方式:

? ? ? ? ? ? (1) 整數(shù)列表

? ? ? ? ? ? ? ? {start..end}

? ? ? ? ? ? ? ? $(seq start [[step]end])

? ? ? ? ? ? (2) glob

? ? ? ? ? ? ? ? /etc/rc.d/rc3.d/K*

? ? ? ? ? ? (3) 命令

? ? ? ? 通過(guò)ping命令探測(cè)10.49.128.1-254范圍內(nèi)的所有主機(jī)的在線狀態(tài);

? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? #

? ? ? ? ? ? net='10.49.128'

? ? ? ? ? ? uphosts=0

? ? ? ? ? ? downhosts=0

? ? ? ? ? ? for i in {1..20}; do

? ? ? ? ? ? ? ? ping -c 1 -w 1 ${net}.${i} &> /dev/null

? ? ? ? ? ? ? ? if [ $? -eq 0 ]; then

? ? ? ? ? ? ? ? echo "${net}.${i} is up."

? ? ? ? ? ? ? ? ? ? let uphosts++

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? echo "${net}.${i} is down."

? ? ? ? ? ? ? ? ? ? let downhosts++

? ? ? ? ? ? ? ? fi

? ? ? ? ? ? done

? ? ? ? ? ? ? ?

? ? ? ? ? ? echo "Up hosts: $uphosts."

? ? ? ? ? ? echo "Down hosts: $downhosts."? ? ? ? ? ?

? ? while循環(huán):

? ? ? ? while CONDITION; do

? ? ? ? ? ? 循環(huán)體

? ? ? ? ? ? 循環(huán)控制變量修正表達(dá)式

? ? ? ? done

? ? ? ? 進(jìn)入條件:CONDTION測(cè)試為"真"

? ? ? ? 退出條件:CONDTION測(cè)試為"假"

? ? ? ? ? ? 因此:CONDTION一般應(yīng)該有循環(huán)控制變量;而此變量的值會(huì)在循環(huán)體不斷地被修正;

? ? until循環(huán):

? ? ? ? until CONDITION; do

? ? ? ? ? ? 循環(huán)體

? ? ? ? ? ? 循環(huán)控制變量修正表達(dá)式

? ? ? ? done

? ? ? ? 進(jìn)入條件:CONDTION測(cè)試為"假"

? ? ? ? 退出條件:CONDTION測(cè)試為"真"

? ? ? ?

? ? ? ? 示例:求100以內(nèi)所有正整數(shù)之和;

? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? #

? ? ? ? ? ? declare -i sum=0

? ? ? ? ? ? declare -i i=1

? ? ? ? ? ? while [ $i -le 100 ]; do

? ? ? ? ? ? ? ? let sum+=$i

? ? ? ? ? ? ? ? let i++

? ? ? ? ? ? done

? ? ? ? ? ? echo "$i"

? ? ? ? ? ? echo "Summary: $sum."

? ? ? ? 練習(xí):添加10個(gè)用戶

? ? ? ? ? ? user1-user10

? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? #

? ? ? ? ? ? declare -i i=1

? ? ? ? ? ? declare -i users=0

? ? ? ? ? ? while [ $i -le 10 ]; do

? ? ? ? ? ? ? ? if ! id user$i &> /dev/null; then

? ? ? ? ? ? ? ? useradd user$i

? ? ? ? ? ? ? ? ? echo "Add user: user$i."

? ? ? ? ? ? ? ? ? ? let users++

? ? ? ? ? ? ? ? fi

? ? ? ? ? ? ? ? let i++

? ? ? ? ? ? done

? ? ? ? ? ? echo "Add $users users."? ? ? ? ? ?

? ? ? ? 練習(xí):通過(guò)ping命令探測(cè)172.16.250.1-254范圍內(nèi)的所有主機(jī)的在線狀態(tài);(用while循環(huán))

? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? #

? ? ? ? ? ? declare -i i=1

? ? ? ? ? ? declare -i uphosts=0

? ? ? ? ? ? declare -i downhosts=0

? ? ? ? ? ? net='172.16.250'

? ? ? ? ? ? while [ $i -le 20 ]; do

? ? ? ? ? ? ? ? if ping -c 1 -w 1 $net.$i &> /dev/null; then

? ? ? ? ? ? ? ? ? ? echo "$net.$i is up."

? ? ? ? ? ? ? ? ? ? let uphosts++

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? echo "$net.$i is down."

? ? ? ? ? ? ? ? ? ? let downhosts++

? ? ? ? ? ? ? ? fi

? ? ? ? ? ? ? ? let i++

? ? ? ? ? ? done

? ? ? ? ? ? echo "Up hosts: $uphosts."

? ? ? ? ? ? echo "Down hosts: $downhosts."

? ? ? ? 練習(xí):打印九九乘法表;(分別使用for和while循環(huán)實(shí)現(xiàn))

? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? #

? ? ? ? ? ? for j in {1..9}; do

? ? ? ? ? ? ? ? for i in $(seq 1 $j); do

? ? ? ? ? ? ? ? ? ? echo -e -n "${i}X${j}=$[$i*$j]\t"

? ? ? ? ? ? ? ? done

? ? ? ? ? ? ? ? echo

? ? ? ? ? ? done? ? ? ? ? ?

? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? #

? ? ? ? ? ? declare -i i=1

? ? ? ? ? ? declare -i j=1

? ? ? ? ? ? while [ $j -le 9 ]; do

? ? ? ? ? ? ? ? while [ $i -le $j ]; do

? ? ? ? ? ? ? ? ? ? echo -e -n "${i}X${j}=$[$i*$j]\t"

? ? ? ? ? ? ? ? ? ? let i++

? ? ? ? ? ? ? ? done

? ? ? ? ? ? ? ? echo

? ? ? ? ? ? ? ? let i=1

? ? ? ? ? ? ? ? let j++

? ? ? ? ? ? done

? ? ? ? 練習(xí):利用RANDOM生成10個(gè)隨機(jī)數(shù)字,輸出這個(gè)10數(shù)字,并顯示其中的最大者和最小者;

? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? #

? ? ? ? ? ? declare -i max=0

? ? ? ? ? ? declare -i min=0

? ? ? ? ? ? declare -i i=1

? ? ? ? ? ? while [ $i -le 9 ]; do

? ? ? ? ? ? ? ? rand=$RANDOM

? ? ? ? ? ? ? ? echo $rand

? ? ? ? ? ? ? ? if [ $i -eq 1 ]; then

? ? ? ? ? ? ? ? ? ? max=$rand

? ? ? ? ? ? ? ? ? ? min=$rand

? ? ? ? ? ? ? ? fi

? ? ? ? ? ? ? ? if [ $rand -gt $max ]; then

? ? ? ? ? ? ? ? ? ? max=$rand

? ? ? ? ? ? ? ? fi

? ? ? ? ? ? ? ? if [ $rand -lt $min ]; then

? ? ? ? ? ? ? ? ? ? min=$rand

? ? ? ? ? ? ? ? fi

? ? ? ? ? ? ? ? let i++

? ? ? ? ? ? done

? ? ? ? ? ? echo "MAX: $max."

? ? ? ? ? ? echo "MIN: $min."

bash腳本編程

? ? while CONDITION; do

? ? ? ? 循環(huán)體

? ? done

? ? 進(jìn)入條件:CONDITION為true;

? ? 退出條件:false

? ? until CONDITION; do

? ? ? ? 循環(huán)體

? ? done

? ? 進(jìn)入條件:false

? ? 退出條件:true

? ? ? ? 示例:求100以內(nèi)所正整數(shù)之和;

? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? #

? ? ? ? ? ? declare -i i=1

? ? ? ? ? ? declare -i sum=0

? ? ? ? ? ? until [ $i -gt 100 ]; do

? ? ? ? ? ? ? ? let sum+=$i

? ? ? ? ? ? ? ? let i++

? ? ? ? ? ? done

? ? ? ? ? ? echo "Sum: $sum"? ?

? ? ? ? 示例:打印九九乘法表

? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? #

? ? ? ? ? ? declare -i j=1

? ? ? ? ? ? declare -i i=1

? ? ? ? ? ? until [ $j -gt 9 ]; do

? ? ? ? ? ? ? ? until [ $i -gt $j ]; do

? ? ? ? ? ? ? ? ? ? echo -n -e "${i}X${j}=$[$i*$j]\t"

? ? ? ? ? ? ? ? ? ? let i++

? ? ? ? ? ? ? ? done

? ? ? ? ? ? ? ? echo

? ? ? ? ? ? ? ? let i=1

? ? ? ? ? ? ? ? let j++

? ? ? ? ? ? done

? ? 循環(huán)控制語(yǔ)句(用于循環(huán)體中):

? ? ? ? continue [N]:提前結(jié)束第N層的本輪循環(huán),而直接進(jìn)入下一輪判斷;

? ? ? ? ? ? while CONDTIITON1; do

? ? ? ? ? ? ? ? CMD1

? ? ? ? ? ? ? ? ...

? ? ? ? ? ? ? ? if CONDITION2; then

? ? ? ? ? ? ? ? ? ? continue

? ? ? ? ? ? ? ? fi

? ? ? ? ? ? ? ? CMDn

? ? ? ? ? ? ? ? ...

? ? ? ? ? ? done

? ? ? ? break [N]:提前結(jié)束循環(huán);? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? while CONDTIITON1; do

? ? ? ? ? ? ? ? CMD1

? ? ? ? ? ? ? ? ...

? ? ? ? ? ? ? ? if CONDITION2; then

? ? ? ? ? ? ? ? ? ? break

? ? ? ? ? ? ? ? fi

? ? ? ? ? ? ? ? CMDn

? ? ? ? ? ? ? ? ...

? ? ? ? ? ? done

? ? ? ? 示例1:求100以內(nèi)所有偶數(shù)之和;要求循環(huán)遍歷100以內(nèi)的所正整數(shù);

? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? #

? ? ? ? ? ? declare -i i=0

? ? ? ? ? ? declare -i sum=0

? ? ? ? ? ? until [ $i -gt 100 ]; do

? ? ? ? ? ? ? ? let i++

? ? ? ? ? ? ? ? if [ $[$i%2] -eq 1 ]; then

? ? ? ? ? ? ? ? ? ? continue

? ? ? ? ? ? ? ? fi

? ? ? ? ? ? ? ? let sum+=$i

? ? ? ? ? ? done

? ? ? ? ? ? echo "Even sum: $sum"

? ? 創(chuàng)建死循環(huán):

? ? ? ? while true; do

? ? ? ? ? ? 循環(huán)體

? ? ? ? done

? ? ? ? until false; do

? ? ? ? ? ? 循環(huán)體

? ? ? ? done

? ? ? ? 示例2:每隔3秒鐘到系統(tǒng)上獲取已經(jīng)登錄的用戶的信息;如果docker登錄了,則記錄于日志中,并退出;

? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? #

? ? ? ? ? ? read -p "Enter a user name: " username

? ? ? ? ? ? while true; do

? ? ? ? ? ? ? ? if who | grep "^$username" &> /dev/null; then

? ? ? ? ? ? ? ? ? ? break

? ? ? ? ? ? ? ? fi

? ? ? ? ? ? ? ? sleep 3

? ? ? ? ? ? done

? ? ? ? ? ? echo "$username logged on." >> /tmp/user.log? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? 第二種實(shí)現(xiàn):

? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? #

? ? ? ? ? ? read -p "Enter a user name: " username

? ? ? ? ? ? until who | grep "^$username" &> /dev/null; do

? ? ? ? ? ? ? ? sleep 3

? ? ? ? ? ? done

? ? ? ? ? ? echo "$username logged on." >> /tmp/user.log

? ? while循環(huán)的特殊用法(遍歷文件的每一行):

? ? ? ? while read line; do

? ? ? ? ? ? 循環(huán)體

? ? ? ? done < /PATH/FROM/SOMEFILE

? ? ? ? 依次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將行賦值給變量line:

? ? ? ? 示例:找出其ID號(hào)為偶數(shù)的所有用戶,顯示其用戶名及ID號(hào);

? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? while read line;do

? ? ? ? ? ? ? ? ? ? if [ $[`echo $line | cut -d: -f3` % 2] -eq 0 ];then

? ? ? ? ? ? ? ? ? ? ? ? ? ? echo -e -n "username: `echo $line | cut -d: -f1`\t"

? ? ? ? ? ? ? ? ? ? ? ? ? ? echo "uid: `echo $line | cut -d: -f3 `"

? ? ? ? ? ? ? ? ? ? fi

? ? ? ? ? ? done < /etc/passwd? ? ? ?

? ? for循環(huán)的特殊格式:

? ? ? ? for ((控制變量初始化;條件判斷表達(dá)式;控制變量的修正表達(dá)式)); do

? ? ? ? ? ? 循環(huán)體

? ? ? ? done

? ? ? ? 控制變量初始化:僅在運(yùn)行到循環(huán)代碼段時(shí)執(zhí)行一次;

? ? ? ? 控制變量的修正表達(dá)式:每輪循環(huán)結(jié)束會(huì)先進(jìn)行控制變量修正運(yùn)算,而后再做條件判斷;

? ? ? ? 示例:求100以內(nèi)所正整數(shù)之和;

? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? #

? ? ? ? ? ? declare -i sum=0

? ? ? ? ? ? for ((i=1;i<=100;i++)); do

? ? ? ? ? ? ? ? let sum+=$i

? ? ? ? ? ? done

? ? ? ? ? ? echo "Sum: $sum."

? ? ? ? 示例2:打印九九乘法表;

? ? ? ? ? ? #!/bin/bash

? ? ? ? ? ? #

? ? ? ? ? ? for((j=1;j<=9;j++));do

? ? ? ? ? ? ? ? ? ? for((i=1;i<=j;i++))do

? ? ? ? ? ? ? ? ? ? ? ? echo -e -n "${i}X${j}=$[$i*$j]\t"

? ? ? ? ? ? ? ? ? ? done

? ? ? ? ? ? ? ? ? ? echo

? ? ? ? ? ? done

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容