for循环语句主要用于执行次数有限的循环,而不是用于守护进程和无限循环。
语法结构:
for 变量名 in 变量取值列表
do
指令...
done
提示:in 变量值列表 可以省略,省略就相当于 in "$@",也就是使用for i in "$@"。
语法说明:变量名依次获取in 关键字后面的变量取值列表内容(以空格分隔),每次取一个值,然后进入循环体内执行所有命令。然后执行到done结束本次循环,之后,变量名再继续获取变量取值列表中的下一个值,继续执行循环内的所有指令,直到取完变量取值列表的最后一个值并进入循环执行done结束为止。
有点类似“遍历”变量取值列表的意思。
第二种:C语言型for循环语句:
for((expr1; expr2; expr3))
do
指令...
done
说这个语法结构比while语句更规范、更工整。实际工作中使用for的机会更多。
示例1:
[root@vm1 scripts]# cat for1.sh
#!/bin/bash
for((i=1;i<=3;i++))
do
echo $i
done
[root@vm1 scripts]# sh for1.sh
1
2
3
说明:直到循环次数,是有限次循环,则多用for循环,实际工作中使用for的机会更多。
示例2:直接列出元素的方法。
[root@vm1 scripts]# cat for2.sh
#!/bin/bash
for i in 5 4 3 2 1
do
echo $i
done
[root@vm1 scripts]# sh for2.sh
5
4
3
2
1
示例3:利用大括号生成数字序列的方法:
[root@vm1 scripts]# cat for3.sh
#!/bin/bash
#
for i in {5..1}
do
echo $i
done
[root@vm1 scripts]# sh for3.sh
5
4
3
2
1
示例4:利用seq生成数字序列:
[root@vm1 scripts]# cat for4.sh
#!/bin/bash
for i in $(seq 5 -1 1)
do
echo $i
done
[root@vm1 scripts]# sh for4.sh
5
4
3
2
1
man seq:
示例5:获取当前目录中的目录或者文件,并将其作为变量列表打印输出:
[root@vm1 scripts]# cat for5.sh
#!/bin/bash
cd /test
for filename in $(ls)
do
echo $filename
done
[root@vm1 scripts]# sh for5.sh
test1.txt
test2.txt
test3.txt
test4.txt
test5.txt
示例6:用for循环批量修改文件拓展名(把txt改成jpg):
[root@vm1 scripts]# cat for6.sh
#!/bin/bash
cd /test
for filename in $(ls |grep "txt$")
do
mv $filename `echo $filename|cut -d . -f1`.gif
done
[root@vm1 scripts]# cd /test
[root@vm1 test]# ll
total 0
-rw-r--r-- 1 root root 0 Aug 4 00:30 test1.gif
-rw-r--r-- 1 root root 0 Aug 4 00:30 test2.gif
-rw-r--r-- 1 root root 0 Aug 4 00:30 test3.gif
-rw-r--r-- 1 root root 0 Aug 4 00:30 test4.gif
-rw-r--r-- 1 root root 0 Aug 4 00:30 test5.gif
示例7:使用reanme命令进行修改:
rename命令讲解:
rename 参数1 参数2 参数3
参数1:原字符串:将文件名需要替换的字符串;
参数2:目标字符串:将文件名中含有的原字符替换成目标字符串;
参数3:文件:指定要改变文件名的文件列表。
我们完全可以使用mv命令逐个去改,但是使用rename这个命令效率更好。