1. for ... do ... done (固定循環)
1.1 認識 for ... do ... done
昨天剛學過while,until的循環方式 --> Linux 之 shell script -- loop(不定循環)
:符合循環條件便可以無限得循環執行指定的“程序段”,我們便稱為不定循環。今天學習與不定循環相對應的for循環,這種語法則是已經知道要進行幾次循環的狀態。
-
for ... do ... done
的語法結構:
for ... do ... done 固定循環
1.2 for ... do ... done 實例
1.2.1 實例一
- 撰寫要求:
假設我有三種動物,分別是dog,cat,elephant三種,我想每一行都輸出 “There are dogs...”之類的字樣
~~通過它來看一下for循環是怎么用的~~
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
最后的展示結果??,是不是特別簡潔方便!
show_animal.sh
1.2.2 實例二
這是個很有用的小實例哦~~
- 撰寫要求
首先,通過 管線命令cut
擷取/etc/passwd中的 賬號名稱
然后,用id
命令 --依次檢查使用者的 標識符 與 特殊參數
#!/bin/bash
users=$(cut -d ':' -f1 /etc/passwd) #擷取賬號名稱:擷取/etc/passwd文本中以“:”為分隔符的第一列賦值給變量${users}
for username in ${users} # 這里定義變量${username}為${users}的任一值
do
id ${username} #查詢${users}的標識符與特殊參數
done
1.2.3 實例三
ping是判斷網絡狀態的指令,實例三中這串指令執行后可以顯示出192.168.1.1~192.168.1.100共100部主機目前是否能與你的機器連通,貓毛不太懂網域是什么東西,但是搞懂代碼的含義確實可以幫助我學習和理解shell~
vi pingip.sh
寫入如下代碼內容:
#!/bin/bash
network="192.168.1" #先定義一個網域的前面部分
for sitenu in $(seq 1 100) #seq為sequence(連續)的縮寫之意;${1..100}也是可以的
do
#底下的程序在取得ping 的回傳值是正確的還是失敗的!
ping -c 1 -w 1 ${network}.${sitenu} &> /dev/null && result=0 || result=1
#開始顯示結果是正確的啟動(UP)還是錯誤的沒有連通(DOWN)
if [ "${result}" == 0 ]; then
echo "Server ${network}.${sitenu} is UP."
else
echo "Server ${network}.${sitenu} is DOWN."
fi
done
1.2.4 實例四
練習判斷式+循環功能(讓用戶輸入某個目錄文件名,然后找出目錄內的文件名權限)
vi dir_perm.sh
寫入如下代碼:
#!/bin/bash
# 1.先看看這個目錄是否存在
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 的數值處理
-
語法結構
for do done 的另一種寫法
這種語法適合于數值方式的運算當中,在for后面的括號內的三串內容意義為:
- 初始值:某個變量在循環當中的起始值,直接以類似 i=1 設定好
- 限制值:當變量的值在這個限制值的范圍內,就繼續進行循環。例如i<=100
- 執行步階:每作一次循環時,變量的變化量。例如i=i+1(如果每次增加1,可以使用i++的方式)
計算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}"