for循环是编程语言中一种循环语句
示例1:循环读取user.txt中的用户名,创建用户。设置密码。
for i in $(cat /opt/user.txt) do useradd $i echo 123456 | passwd --stdin $i done
示例2:循环读取ipaddr文本文件中地址,执行ping命令,获取结果。根据执行结果将存货的主机地址和不存活的主机地址区分写入两个文件
[root@xue opt]# cat pingtofile.sh for i in $(cat /opt/ipaddr.txt) do ping -c 3 -W 2 $i &> /dev/null #-c 3 ping3次 -W 2 等待时间2s &> /dev/null报错信息导入空设备不显示 if [ $? == 0 ] then echo $i >> /opt/ipservive.txt else echo $i >> /opt/ipdie.txt fi done
示例3 从1累加到100
sum=0 for i in {1..100} do sum=$(($i+$sum)) done echo $sum
常用转义字符
echo -n 表示不换行输出
echo -e 输出转义字符,将转义后的内容输出到屏幕上echo -ne
只有加了-e才能执行下面的转义符:
\b 转义后相当于按退格键(backspace),但前提是"\b"后面存在字符;"\b"表示删除前一个字符,"\b\b"表示删除前两个字符。\c 不换行输出,在"\c"后面不存在字符的情况下,作用相当于 echo -n; 但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。
\n 换行,被输出的字符从"\n"处开始另起一行。
\f 换行,但是换行后的新行的开头位置连接着上一行的行尾;\v 与\f相同;
\t 转以后表示插入tab,即横向制表符;
\r 光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖
\\ 表示插入"\"本身;
使用转义字符-n实现不换行效果
echo "-n不换行" for i in {1..9} do echo -n "*" done echo echo "普通输出换行" for i in {1..9} do echo "*" done
使用嵌套for循环搭配转义字符-n输出正三角
for i in {1..9} #外循环,实现行输出 do for ((j=1;j<=i;j++)) #内循环,实现列输出 do echo -n "*" #每列不换行输出*,输出多少个*取决于上面的j循环(输出个数与行数相关) done echo #此echo为外循环每行换行使用 done
改进正三角,结合-ne 输出九九乘法表
for i in {1..9} #外循环,实现行输出 do for ((j=1;j<=i;j++)) #内循环,实现列输出 do echo -ne "$i*$j=$(($i*$j))\t" #-ne:n不换行输出,-e:为了使用转义符\t。\t:制表符 由于分隔输出 done echo #此echo为外循环每行换行使用 done
跳出for循环:continue与break
continue跳出循环,循环内部跳过本次循环并继续下一次循环
break打破循环,直接跳出循环不再执行
continue 2表示跳出2层循环
continue 3表示跳出3层循环
continue 4表示跳出4层循环
continue 5表示跳出5层循环
不写数字默认为1,continue 1跳出当前循环
break写法同理。
[root@xue opt]# cat continue.sh #直接跳过1层当前循环 echo "continue" for a in {1..5} do for b in {1..5} do if [ $b -eq 3 ] then continue fi echo -ne "a=$a-b=$b\t\t" done echo done echo echo echo #直接跳过2层循环 echo "continue 2" for a in {1..5} do for b in {1..5} do if [ $b -eq 3 ] then continue 2 fi echo -ne "a=$a-b=$b\t\t" done echo done echo echo echo #直接破除1层当前循环 echo "break" for a in {1..5} do for b in {1..5} do if [ $b -eq 3 ] then break fi echo -ne "a=$a-b=$b\t\t" done echo done echo echo echo #直接破除2层循环 echo "break 2" for a in {1..5} do for b in {1..5} do if [ $b -eq 3 ] then break 2 fi echo -ne "a=$a-b=$b\t\t" done echo done