shell for与while循环
一、使用for循环遍历命令的执行结果
for 循环的语法:
- for 参数 in 列表
- do 执行的命令
- done 封闭一个循环
# 循环遍历列表中0~9数字
[root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# for i in {0..9}; do echo "hello"; echo $i ; done
hello
0
hello
1
hello
2
hello
3
hello
4
hello
5
hello
6
hello
7
hello
8
hello
9
使用反引号或$()方式执行命令,命令的结果当作列表进行处理。
# 使用一个命令来产生列表,然后进行读取
# 1.创建mp3的三个文件
[root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# touch a.mp3 b.mp3 c.mp3
# 2.查看创建的mp3的文件
[root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# ls *.mp3
a.mp3 b.mp3 c.mp3
# 3.使用shell命令的反引号进行执行命令
# 将文件名 ls *.mp3的进行依次循环, 使用mv 将当前文件改名为mp4结尾
[root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# for filename in `ls *.mp3`; do
> mv $filename $(basename $filename .mp3).mp4
> done
# 4.查看当前修改后的文件
[root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# ls *.mp4
a.mp4 b.mp4 c.mp4
$(basename $filename .mp3).mp4 表示把当前文件名.mp3结尾的修改成.mp4结尾
二、使用for循环遍历变量或文件内容
列表中包含多个变量,变量用空格分隔
对文本处理,要使用文本查看命令取出文本内容:
默认逐行处理
三、C语言风格的for命令
for ((变量初始化;循环判断条件;变量变化))
do
循环执行命令
done
# 用c语言实现0~10的循环遍历
[root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# for (( i=0;i<=10;i++))
> do
> echo "$i"
> done
0
1
2
3
4
5
6
7
8
9
10
四、while 循环
语法如下:
while test测试是否成立
do
命令
done
# 使用while循环,((a++))表示每次遍历执行时a都会 a+1
[root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# a=1
[root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# while [ $a -lt 10 ]; do ((a++)); echo $a; done
2
3
4
5
6
7
8
9
10
五、死循环
使用:
方式来进行构建死循环。
[root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# while : ;do echo "bash";done
# 输出结果:
bash
bash
bash
.... 无限循环
六、until 循环
until 循环与 while 循环相反,循环测试为假时,执行循环,为真时循环停止
# 使用unitl 来判断 5 < 4条件为假会一直打印 until使用
[root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# until [[ 5 < 4 ]]; do echo "until使用"; done
七、break和contine语句
-
循环和循环可以嵌套
[root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# for name in /home/lvhuiqi/*.sh; > do # 判断/home/lvhuiqi/目录下的所有.sh文件,哪些是可执行文件并且进行运行 > if [ -x $name ]; then > . $name > fi > done -bash other....
-
循环中可以嵌套判断,反过来也可以嵌套
-
循环可以使用break和 continue 语句在循环中退出
break跳出整个循环体:
# 到5以后跳出循环体 [root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# for i in {0..9}; > do > if [ $i -eq 5 ] ; then > break > fi > echo $i > done 0 1 2 3 4
contine跳出当前循环体:
# 跳出等于5的循环体,继续往后执行 [root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# for i in {0..9}; > do > if [ $i -eq 5 ]; then > continue > fi > echo $i > done 0 1 2 3 4 6 7 8 9
八、使用循环对命令行参数的处理
-
命令行参数可以使用 $1 2... 2... 2...{10}…$n进行读取
-
$0表示脚本名称
-
$ 和 $@ 代表所有位置参数*
-
$# 代表位置参数的数量
举个栗子,使用for来进行处理位置参数:
#! /bin/bash
for pos in $*;
do
if [ "$pos" = "abc" ]; then
echo $pos
fi
done
# 传入值 abc 可以匹配
[root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# ./test.sh abc
abc
# 传入不是 abc 不可以匹配
[root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# ./test.sh abcd
举个栗子,使用while来进行处理位置参数:
#! /bin/bash
# 根据传递的参数数量进行比较,只要符合满足数量大于等于1
while [ $# -ge 1 ]
do
echo $#
echo "do something"
shift
done
shift 作用是可将参数依次剔除掉,比如a b c d e 那么会将 a剔除掉,变成 b c d e 下次将 b 剔除掉, 变成 c d e
# 执行并返回结果
[root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# ./test.sh a b c d e
5
do something
4
do something
3
do something
2
do something
1
do something
#! /bin/bash
while [ $# -ge 1 ]
do
# 如果传递的第一个参数为 "help" 字符串, 那么将打印出来
if [ "$1" = "help" ]; then
echo $1
fi
shift
done
[root@iZbp1e44zna0rzyna76eszZ lvhuiqi]# ./test.sh a help b c
help