for 命令
for var in list
do
commands
done
var in list 默认用 空格做字段分隔符 IFS称为内部字段分隔符 IFS=$'\n' shell中添加此行 则用换行符作为字段分隔符。
C语言的for命令
for (i=0;i<10;i++)
{
printf("The next number is %d\n",i)
}
第一部分将默认值赋给该变量。中间的部分定义了循环重复的条件。当定义的条件不成立时,for循环就停止了。
bash shell C语言风格for 循环
for (( a=1;a<10;a++))
while 命令
while test command
do
other commands
done
var1=10
while [ $var1 -gt 0 ]
do
echo $var1
var1=$[$var1-1] #shell中的赋值和操作默认都是字符串处理,在此记下shell中进行数学运算的几个特殊方法
done
详情见shell中数学计算
1)使用let
var=1
let "var+=1"
echo $var
输出结果为2,这次没有悲剧
注意:
a)经我测试let几乎支持所有的运算符,在网上看到一篇文章说“let不支持++、--和逗号、(、)”,但经我测试自加、自减、以及括号的优先级都得到了很好的支持
b)方幂运算应使用“**”
c)参数在表达式中直接访问,不必加$
d)一般情况下算数表达式可以不加双引号,但是若表达式中有bash中的关键字则需加上
e)let后的表达式只能进行整数运算
2)使用(())
var=1
((var+=1))
echo $var
输出结果为2
注意:
(())的使用方法与let完全相同
3)使用$[]
var=1
var=$[$var+1]
echo $var
输出结果位2
注意:
a)$[]将中括号内的表达式作为数学运算先计算结果再输出
b)对$[]中的变量进行访问时前面需要加$
c)$[]支持的运算符与let相同,但也只支持整数运算
Until命令
until test command
do
other commands
done
嵌套循环
eg
#!/bin/bash
#nesting for loops
for (( a=1;a<=3;a++))
do
echo "Starting loop $a:"
for (( b=1;b<=3;b++))
do
echo " Inside loop:$b"
done
done
linux-boss08:/opt/gl # bash test1.sh
Starting loop 1:
Inside loop:1
Inside loop:2
Inside loop:3
Starting loop 2:
Inside loop:1
Inside loop:2
Inside loop:3
Starting loop 3:
Inside loop:1
Inside loop:2
Inside loop:3
循环处理文件数据
在/etc/vim/vimrc中添加以下代码后,重启vim即可实现按TAB产生4个空格:
set ts=4
使用嵌套循环,修改IFS环境变量
经典例子处理/etc/passwd文件中数据。
eg
#!/bin/bash
#changing the IFS value
IFS.OLD=$IFS
IFS=$'\n'
for entry in `cat /etc/passwd`
do
echo "value in $entry -"
IFS=:
for value in $entry
do
echo " $value"
done
done
控制循环 break continue
break 命令
#!/bin/bash
#breaking out of a for loop
for var in 1 2 3 4 5 6 7 8 9 10
do
if [ $var -eq 5 ]
then
break
fi
echo "Iteration number: $var"
done
echo "The for loop is complated"
#!/bin/bash
#breaking out of a for loop
for var in 1 2 3 4 5 6 7 8 9 10
do
if [ $var -eq 5 ]
then
break
fi
echo "Iteration number: $var"
done
echo "The for loop is complated"
跳出内部循环
在处理多个循环时,break命令会自动终止你所在最里面的循环:
跳出外部循环
有时你在内部循环,但需要停止外部循环。break命令接受单个命令行参数值:
break n
其中n说明要跳出的循环层级。默认情况下,n为1,表明跳出的时当前的循环。如果你将n设为2,break命令就会停止上一级的外部循环:
#!/bin/bash
#breaking out of an outer loop
for (( a=1;a<4;a++))
do
echo "Outer loop:$a"
for ((b=1;b<100;b++))
do
if [ $b -gt 4 ]
then
break 2
fi
echo " Inner loop:$b"
done
done
linux-boss08:/opt/gl # bash test5.sh
Outer loop:1
Inner loop:1
Inner loop:2
Inner loop:3
Inner loop:4
continue命令
continue 命令是提早结束执行循环内部的命令但并不完全终止整个循环的一个途径。
#!/bin/bash
#using the continue command
for ((var1=1;var1<15;var1++))
do
if [ $var1 -gt 5 ] && [ $var1 -lt 10 ]
then
continue
fi
echo "Iteration number:$var1"
done
linux-boss08:/opt/gl # bash test6.sh
Iteration number:1
Iteration number:2
Iteration number:3
Iteration number:4
Iteration number:5
Iteration number:10
Iteration number:11
Iteration number:12
Iteration number:13
Iteration number:14
处理循环的输出:
done 可以接 > |
done > output.txt
done | sort