循环语句
for 循环
for 循环有2种形式:
1、 for-in 语句
2、 for (( variable assignment ; condition ; iteration process ))
for in
for var in list
do
command
done
list 代表要循环的值,在每次循环的时候,会把当前的值赋给var变量,这样在循环体中就可以直接通过 $var 获取当前的值了。
#!/bin/bash
for num in 1 2 3 4 5 6
do
echo $num
done
#输出
#1
#2
#3
#4
#5
#6
以上会根据空格将1 2 3 4 5 6分割,然后依次输出出来
#!/bin/bash
for num in 1,2,3,4,5,6
do
echo $num
done
#输出
#1,2,3,4,5,6
使用 “,” 分割不行。
造成这样的结果是因为:for in 循环默认是循环一组通过空格 或者 制表符 或者换行(Enter 键) 分割的,是由系统环境变量 IFS定义的。当然,既然是由环境变量定义的,那当然也就能修改。
修改 IFS 变量,改变for in 循环的 list 格式
#!/bin/bash
#定义一个变量oldIFS保存未修改前的IFS的值
oldIFS=$IFS
#修改IFS值,以逗号为分隔符
IFS=$','
list=1,2,3,4,5
list2="1 2 3 4 5"
for var in $list
do
echo $var
done
for var2 in $list2
do
echo $var2
done
#还原IFS的值
IFS=$oldIFS
#输出
#1
#2
#3
#4
#5
#1 2 3 4 5
C语言风格的for循环
使用(())来遍历循环
for (( variable assignment ; condition ; iteration process ))
#!/bin/bash
for (( i=1; i<=5; i++ ))
do
echo i= $i
done
#输出
#i= 1
#i= 2
#i= 3
#i= 4
#i= 5
while 循环
while test command
do
other commands
done
与 if else 语句一样,后面接 test 命令,如果 test 后面的命令的退出状态码为 0,那么就进入循环体,执行do后面的逻辑。
#!/bin/bash
flag=10
while test $flag -gt 5
do
echo $flag
# 如果没有这句,那么flag的值一直为10,就会无限循环执行
flag=$[$flag - 1]
done
主要,test 的替换还有 [ command opr command ] 和 (( command opr command ))。
#!/bin/bash
flag=10
while [ $flag -gt 5 ]
do
echo $flag
# 如果没有这句,那么flag的值一直为10,就会无限循环执行
flag=$[$flag - 1]
done
#输出
#10
#9
#8
#7
#6
注意,[ $flag -gt 5 ] 中的 [空格…空格] 要留空格
#!/bin/bash
flag=10
while (($flag >= 5))
do
echo $flag
# 如果没有这句,那么flag的值一直为10,就会无限循环执行
flag=$[$flag - 1]
done
#输出
#10
#9
#8
#7
#6
#5
注意,使用 (()) 运算不能要使用日常的运算符 ,如 大于用 (>) ,不能使用 gt 等。
until循环语句
until语句与 while语句更好相反,while 语句是在test命令退出状态为 0 的时候执行循环,而until语句是在test命令退出状态码不为0的时候执行。
#!/bin/bash
flag=1
until (($flag > 5))
do
echo flag=$flag
flag=$[ $flag + 1 ]
done
#输出
#flag=1
#flag=2
#flag=3
#flag=4
#flag=5
break
break 用于退出当前循环。
#!/bin/bash
for (( flag=0; flag <= 5; flag++ ))
do
if (( $flag == 3 ))
then
break
fi
echo flag=$flag
done
#输出
#flag=0
#flag=1
#flag=2
continue
continue表示终止当前的一次循环,进入下一次循环,注意,continue后面的语句不会执行。
#!/bin/bash
for (( flag=0; flag <= 5; flag++ ))
do
if (( $flag == 3 ))
then
continue
fi
echo flag=$flag
done
#输出
#flag=0
#flag=1
#flag=2
#flag=4
#flag=5