在shell 脚本中循环结构共有三种, for while until,until一般用的不多。
一 、 for 循环
用法一:遍历命令行参数
for i in "$@"do
sum=$((sum + i))
done
echo "sum=$sum"
将个参数相加求和。
用法二:遍历list
for i in {1..100}
do
sum=`expr $sum + $i`
done
echo "sum=$sum"
求和:1+2 +3 +...+100
用法三:遍历list
for ip in 10.118.4.{1..254}
do
(
ping $ip -c 2 > /dev/null
if test $? -eq 0
then
echo "$ip" is alive
fi
)&
done
与用法2其实是一样的写法,是用法二的变种
用法四:遍历一行中的单词
read line
for word in $line
do
echo $word
done
用法二的变种
用法四:C风格
for ((i=0;i<${#word}; i++))
do
echo ${word:i:1}
done
遍历word 中的字符
用法五:子shell产生list
for i in $(seq 1 100)
do
sum=`expr $sum + $i`
done
echo "sum=$sum"
用法六:遍历关联数组
//设置关联数组
for i in a b c d e
do
array[$i]=$value
let value++
done
//打印数组元素值,${!array[*]} 列出数组索引
for i in ${!array[*]}
do
echo ${array["$i"]}
done
二、 while 循环
while 循环通常用于处理行的读取
用法一:取命令执行结果作为条件
while read line
do
echo $line
done < inputfile
从inputfile 中循环读取一行,默认从stdin读取
也可以写成:
cat inputfile | while read line
do
echo $line
done
用法二:用法一变种, 无限循环
while true
do
:
done
用法三:用子shell 输入
while read line
do
echo $line
done< <(ls -l)
注意这里<(ls -l) 会当成一个临时文件进行输入
用法四:C风格
count=0
while ((count < 5))
do
echo $count
let count++
done
用法五:
count=1
while [[ $flag -ne 1 ]]
do
echo $count
let count++
[ $count -eq 5 ] && flag=1
done
其实以上用法 大多结构都为 while 命令 do done, 由于shell 脚本大多用于文本处理,系统管理,很少会用来做大量算术运算因此,用法一用的更多些。
三、 until
until在等待某个事件发生时比较好用
如: 等待某个用户登入
read user
until who | grep "$user" > /dev/null
do
sleep 30
done
基本都能用while 来替换