1. for ... do ... done (固定循環(huán))
1.1 認(rèn)識 for ... do ... done
昨天剛學(xué)過while,until的循環(huán)方式 --> Linux 之 shell script -- loop(不定循環(huán))
:符合循環(huán)條件便可以無限得循環(huán)執(zhí)行指定的“程序段”,我們便稱為不定循環(huán)。今天學(xué)習(xí)與不定循環(huán)相對應(yīng)的for循環(huán),這種語法則是已經(jīng)知道要進(jìn)行幾次循環(huán)的狀態(tài)。
-
for ... do ... done的語法結(jié)構(gòu):
for ... do ... done 固定循環(huán)
1.2 for ... do ... done 實(shí)例
1.2.1 實(shí)例一
- 撰寫要求:
假設(shè)我有三種動物,分別是dog,cat,elephant三種,我想每一行都輸出 “There are dogs...”之類的字樣
~~通過它來看一下for循環(huán)是怎么用的~~
vi show_animal.sh輸入如下代碼:
#!/bin/bash
for animal in dog cat elephant # var=animal;con1=dog;con2=cat;con3=elephant
do
echo "There are ${animal}s..."# ${animal}在第一行就被定義了
done
最后的展示結(jié)果??,是不是特別簡潔方便!

show_animal.sh
1.2.2 實(shí)例二
這是個(gè)很有用的小實(shí)例哦~~
- 撰寫要求
首先,通過 管線命令cut擷取/etc/passwd中的 賬號名稱
然后,用id命令 --依次檢查使用者的 標(biāo)識符 與 特殊參數(shù)
#!/bin/bash
users=$(cut -d ':' -f1 /etc/passwd) #擷取賬號名稱:擷取/etc/passwd文本中以“:”為分隔符的第一列賦值給變量${users}
for username in ${users} # 這里定義變量${username}為${users}的任一值
do
id ${username} #查詢${users}的標(biāo)識符與特殊參數(shù)
done
1.2.3 實(shí)例三
ping是判斷網(wǎng)絡(luò)狀態(tài)的指令,實(shí)例三中這串指令執(zhí)行后可以顯示出192.168.1.1~192.168.1.100共100部主機(jī)目前是否能與你的機(jī)器連通,貓毛不太懂網(wǎng)域是什么東西,但是搞懂代碼的含義確實(shí)可以幫助我學(xué)習(xí)和理解shell~
vi pingip.sh 寫入如下代碼內(nèi)容:
#!/bin/bash
network="192.168.1" #先定義一個(gè)網(wǎng)域的前面部分
for sitenu in $(seq 1 100) #seq為sequence(連續(xù))的縮寫之意;${1..100}也是可以的
do
#底下的程序在取得ping 的回傳值是正確的還是失敗的!
ping -c 1 -w 1 ${network}.${sitenu} &> /dev/null && result=0 || result=1
#開始顯示結(jié)果是正確的啟動(UP)還是錯(cuò)誤的沒有連通(DOWN)
if [ "${result}" == 0 ]; then
echo "Server ${network}.${sitenu} is UP."
else
echo "Server ${network}.${sitenu} is DOWN."
fi
done
1.2.4 實(shí)例四
練習(xí)判斷式+循環(huán)功能(讓用戶輸入某個(gè)目錄文件名,然后找出目錄內(nèi)的文件名權(quán)限)
vi dir_perm.sh 寫入如下代碼:
#!/bin/bash
# 1.先看看這個(gè)目錄是否存在
read -p "Please input a directory" dir
if [ "${dir}" == "" -o ! -d "${dir}" ]; then
echo "The ${dir} is NOT exist in your system."
exit 1
fi
# 2. 開始測試文件
filelist=$(ls ${dir}) #列出所有在該目錄下的文件名
for filename in ${filelist}
do
perm=""
test -r "${dir}/${filename}" && perm="${prem} readable"
test -w "${dir}/${filename}" && perm="${perm} writable"
test -x "${dir}/${filename}" && perm="${perm} executable"
echo "The file ${dir}/${filename}'s permission is ${perm}"
done
1.3 for ... do ... done 的數(shù)值處理
-
語法結(jié)構(gòu)
for do done 的另一種寫法
這種語法適合于數(shù)值方式的運(yùn)算當(dāng)中,在for后面的括號內(nèi)的三串內(nèi)容意義為:
- 初始值:某個(gè)變量在循環(huán)當(dāng)中的起始值,直接以類似 i=1 設(shè)定好
- 限制值:當(dāng)變量的值在這個(gè)限制值的范圍內(nèi),就繼續(xù)進(jìn)行循環(huán)。例如i<=100
- 執(zhí)行步階:每作一次循環(huán)時(shí),變量的變化量。例如i=i+1(如果每次增加1,可以使用i++的方式)
計(jì)算1+2+3 ... +100的總和
vi cal_1_100-2.sh
#!/bin/bash
read -p "Please input a number, I will count for 1+2+...+your_input:" nu
s=0
for (( i=1; i<=${nu}; i=i+1 ))
do
s=$((${s}+${i}))
done
echo "The result of '1+2+3+...+${nu}' is ==> ${s}"

