for fruit in apple orange pear #写死 do each ${fruit}s done fruits="apple orange pear" #输入变量的值 for f in $fruits
一、for循环
1、向for提供数据
1)写死 或 变量
2)read
3)从命令行读取$* $@
for fruit in $*; do 或者 for fruit; do(这一技术使用于函数,乱入函数:)
do_i_like() { for fruit; do echo I realy like ${fruit}s done } do_i_like apple banana oranges
4)使用seq命令给for输入数据(用于产生从某个数到另外一个数之间的所有整数)
# seq 1 10
结果是1 2 3 4 5 6 7 8 9 10
for i in `seq 1 10`
for host in `grep "172.30.0" /etc/hosts | awk '{ print $2 }'`
2 bash有类似C风格的for循环
1 for ((i=1,j=100; i<=10; i++,j-=2 )) 2 do 3 printf "i=%03d j=%03d " $i $j 4 done
二、while循环
在没有需要遍历的列表但在具有决定循环何时结束的可测试条件时,使用while最合适。
1)测试循环本身的变化
2)逐行读取文本文件的内容
read password < /etc/passwd读入一行 while read passwd do echo $passwd #这里可以加入好多功能! done < /etc/passwd一直循环读,直到不再输入
#!/bin/bash #通过管道循环读取/etc/passwd内容 cat /etc/passwd | while read line do #以:为分割符,只读取第一个字段 user=`awk -F : '{print $1}' <<< ${line}` echo "Account: ${user}" done
3)重定向到文件
1 i=1 2 while [ $i -lt 5 ] 3 do 4 echo "`date`" : Partition $i 5 ls -ld /dev/sda$i 6 sleep 1 7 let i=$i+1 8 done > partition.txt 2>partitionerror.txt
4)内置的:命令,或者是/bin/true命令,他们总是返回0,表示成功,使用他们可以让循环永远执行下去。
host=${1:-declan} while grep -qw $host /tmp/hosts-to-ping.txt do : done
5)死循环
1 while : #中间有空格 2 do 3 echo 'xx' 4 sleep 1 5 done
用ctrl+c结束
三、嵌套循环
一个循环存在于另一个循环中
四、循环的break和continue
break break 2退出两层;
continue continue 2表示要跳转的外层循环层数
五、带case的while循环
就是while里边使用case
六、until循环
除了测试条件相反,until循环与while循环在其他地方完全相同。即满足条件就退出循环
until 条件 do : done
七、select循环
非常适合编写菜单的循环,常和if、case等一起使用
它根本没有条件测试,退出的唯一方式是使用break或exit 打断用ctrl+c
提示符在$PS3变量
和for一样可以去掉in (x),这样select会使用自己所在的脚本或函数的$*参数
我的samba管理器好想可以用它做一个命令行的!
1 select item in one two three four five 2 do 3 if [ ! -z $item ]; then 4 echo "You choiced $item" 5 break 6 else 7 echo "$REPLY is not valid" 用户输入的值在$REPLY变量 8 fi 9 done