目录
1. for 命令
1.1 for 基本用法
bash shell 提供 for
命令,用来处理循环迭代值,其基本格式如下:
for var in list
do
command
done
#list 参数中是你提供的一系列需要迭代的值
1.2 读取列表中的值
for
命令最基本的用法就是遍历命令自身定义的一系列值,例:
#例 1:
[root@localhost tmp]# cat test1
#!/bin/bash
for i in A B C
do
echo This is $i
done
[root@localhost tmp]# ./test1
This is A
This is B
This is C
#例 2:
[root@localhost tmp]# cat test2
#!/bin/bash
for i in A "B C" D
do
echo This is $i
done
[root@localhost tmp]# ./test2
This is A
This is B C
This is D
#如果循环列表中有词组,需用引号括起来被视为一个整体,否则会被拆开处理
1.3 从变量中读取列表
我们也可以将一系列变量储存在一个变量值里然后再遍历这个变量,例:
[root@localhost tmp]# cat test3
#!/bin/bash
var="A B C"
for i in $var
do
echo This is $i
done
[root@localhost tmp]# ./test3
This is A
This is B
This is C
1.4 从命令读取值
下面是for
从命令中读取值:
[root@localhost tmp]# cat data
A B C
[root@localhost tmp]# cat test4
#!/bin/bash
for i in $(cat data)
do
echo This is $i
done
[root@localhost tmp]# ./test4
This is A
This is B
This is C
1.5 更改字段分隔符
系统内有一个特殊的环境变量 IFS
,它叫做内部字段分隔符。正因如此,bash shell 会将下列字符当做字段分隔符:
- 空格
- 制表符
- 换行符
我们可以通过更改IFS
的值来自定义需要的字段分隔符,如修改IFS
值,使其只识别换行符:
IFS=$'\n'
警告:
一般实际运用中,为安全考虑,在更改IFS
值之前应前将其值保存在一个变量中,这样使用完自定义IFS
之后,再将其还原:
IFS_ori=$IFS
IFS=$'\n'
<代码段>
IFS=$IFS_ori #用完之后改为系统默认值
此外,如果想指定多个字段分隔符可以使用如下命令:
IFS=$'\n':;"
#这个值将会把换行符,冒号,分号,双引号作为分隔符
1.6 C 语言风格的 for 命令
shell 也提供 C 语言风格的 for 命令,但不同的是这里需要在 for 语句中加两个括号(())
,例:
[root@localhost tmp]# cat test5
#!/bin/bash
for (( i=1; i<10; i++ ))
do
echo This is $i
done
[root@localhost tmp]# ./test5
This is 1
This is 2
This is 3
This is 4
This is 5
This is 6
This is 7
This is 8
This is 9
2. while 命令
while
命令可以想成是 if
与for
的结合体,它需要定义一个测试条件,一旦条件为真,则进入循环体,执行一组命令。
2.1 while 的基本格式
while test command
do
commands
done
例:
[root@localhost tmp]# cat test6
#!/bin/bash
var=10
while [ $var -ge 0 ]
do
echo This is $var
var=$(($var-1))
done
[root@localhost tmp]# ./test6
This is 10
This is 9
This is 8
This is 7
This is 6
This is 5
This is 4
This is 3
This is 2
This is 1
This is 0
3. 循环控制
这里有两个命令可以控制循环,如下:
- break
- continue
下面介绍这些命令的使用方法。
3.1 break 命令
break 命令是退出循环的一种方法,我们可以用它退出任意类型的循环,包括for
,while
。
3.1.1 退出单个循环
例1:
[root@localhost tmp]# cat test7
#!/bin/bash
for i in 1 2 3 4 5
do
if [ $i -eq 4 ]
then
break
fi
echo This is $i
done
[root@localhost tmp]# ./test7
This is 1
This is 2
This is 3
#当 i 等于 4 是跳出循环
例 2:
[root@localhost tmp]# cat test8
#!/bin/bash
var=1
while [ $var -le 5 ]
do
if [ $var -eq 4 ]
then
break
fi
echo This is $var
var=$(($var+1))
done
[root@localhost tmp]# ./test8
This is 1
This is 2
This is 3
#当 i 等于 4 是跳出循环
3.1.2 跳出内部循环
在break
处理循环时,它会跳出它所在的当前循环,即是最内层的循环,并不会跳出外循环。
例:
[root@localhost tmp]# cat test9
#!/bin/bash
for i in 1 2 3 4 5
do
echo OUT is $i
for j in 7 8 9 10
do
if [ $j -eq 9 ]
then
break
fi
echo " IN is $j"
done
done
#这里 break只会跳出它所在内循环内,而不会影响外部循环
[root@localhost tmp]# ./test9
OUT is 1
IN is 7
IN is 8
OUT is 2
IN is 7
IN is 8
OUT is 3
IN is 7
IN is 8
OUT is 4
IN is 7
IN is 8
OUT is 5
IN is 7
IN is 8
3.1.3 跳出外部循环
有时在内部循环,但是又需要直接跳出外部循环,这是可以使用:
break n
#n 表示跳出的循环层级
例:
for i in 1 2 3 4 5
do
echo OUT is $i
for j in 7 8 9 10
do
if [ $j -eq 9 ]
then
break2
fi
echo " IN is $j"
done
done
#这里 break 跳出 2 层循环后,刚好跳出最外层循环
[root@localhost tmp]# ./test10
OUT is 1
IN is 7
IN is 8
3.2 continue 命令
continue
可以终止当前循环,但不会直接跳出循环而是直接进入下一次循环,不会执行 continue 的命令,例:
[root@localhost tmp]# cat test11
#!/bin/bash
var=0
while [ $var -le 5 ]
do
var=$(($var+1))
if [ $var -eq 4 ]
then
continue
fi
echo This is $var
done
#这里 continue 跳过了 var 等于 4 的情况而直接进入下一次循环,也即是 var=5 的情况
[root@localhost tmp]# ./test11
This is 1
This is 2
This is 3
This is 5
This is 6
此外,continue
也支持像break
那样带参数:
continue n
#n 表示要继续执行那一层循环