循环 (loop)

while do done, until do done (不定循环)

while [ condition ]		<==do 是循环的开始!
do						<==do 是循环的开始!
	程序段落		
done					<==done 是循环的结束

while 的中文是『当…时』,所以,这种方式说的是『当 condition 条件成立时,就进行循环,直到condition 的条件不成立才停止』的意思还有另外一种不定循环的方式:

until [ condition ]
do
	程序段落
done

这种方式恰恰与 while 相反,它说的是『当 condition 条件成立时,就终止循环, 否则就持续进行循环的程序段。』

while例子

#!/bin/bash
# Program:
#
Repeat question until user input correct answer.
# History:
# 2015/07/17
VBird
First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
while [ "${yn}" != "yes" -a "${yn}" != "YES" ]
do
read -p "Please input yes/YES to stop this program: " yn
done
echo "OK! you input the correct answer."

until 例子

#!/bin/bash
# Program:
#
Repeat question until user input correct answer.
# History:
# 2015/07/17
VBird
First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
until [ "${yn}" == "yes" -o "${yn}" == "YES" ]
do
read -p "Please input yes/YES to stop this program: " yn
done
echo "OK! you input the correct answer."

如果我想要计算 1+2+3+…+100 这个数据呢?例子

#!/bin/bash
# Program:
#
Use loop to calculate "1+2+3+...+100" result.
# History:
# 2015/07/17
VBird
First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
s=0 # 这是加总的数值变数
i=0 # 这是累计的数值,亦即是 1, 2, 3....
while [ "${i}" != "100" ]
do
i=$(($i+1)) # 每次 i 都会增加 1
s=$(($s+$i)) # 每次都会加总一次!
done
echo "The result of '1+2+3+...+100' is ==> $s"

for…do…done (固定循环)

for var in con1 con2 con3 ...
do
	程序段
done
  1. 第一次循环时, $var 的内容为 con1 ;
  2. 第二次循环时, $var 的内容为 con2 ;3. 第三次循环时, $var 的内容为 con3 ;

echo dog, cat, elephant例子

#!/bin/bash
# Program:
#
Using for .... loop to print 3 animals
# History:
# 2015/07/17
VBird
First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
for animal in dog cat elephant
do
echo "There are ${animal}s.... "
done

id Linux 系统上面的账号例子

#!/bin/bash
# Program
#
Use id, finger command to check system account's information.
# History
# 2015/07/17
VBird
first release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
users=$(cut -d ':' -f1 /etc/passwd) # 撷取账号名称
for username in ${users} # 开始循环进行!
do
id ${username}
done

ping 192.168.1.1~192.168.1.100 100 台主机

#!/bin/bash
# Program
#
Use ping command to check the network's PC state.
# History
# 2015/07/17
VBird
first release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
network="192.168.1" # 先定义一个网域的前面部分!
for sitenu in $(seq 1 100) # seq 为 sequence(连续) 的缩写之意
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

其实这个范例的重点在 $(seq …) 那个位置!那个 seq 是连续 (sequence) 的缩写之意!代表后面接的两个数值是一直连续的! 如此一来,就能够轻松的将连续数字带入程序中啰!
除了使用 $(seq 1 100) 之外,你也可以直接使用 bash 的内建机制来处理喔!可以使用

{1…100} 来取代 $(seq 1 100) ! 那个大括号内的前面/后面用两个字符,中间以两个小数点来代表连续出现的意思!
例如要持续输出 a, b, c…g 的话, 就可以使用『 echo {a…g} 』这样的表示方式!

&>即2&>1

Guess you like

Origin blog.csdn.net/qq_52835624/article/details/119183959