基本语法
for的列表循环
1)循环体前用in,循环体用{ }花括号括起来,然后用do和done。
2)不带列表的for循环,for后直接跟条件,然后用do和done。
3)类C风格的for循环,for后边用(())两层双括号括住条件,条件之间用;分号隔开,然后用do和done。
赋予变量范围
[root@LDP ~]# cat 3.sh
for i in 1 2 3 4 5
#表示遍历整数序列1到5,每次循环将序列中的一个元素赋值给变量i。
do
#do 表示循环开始
echo "倒数$i"
#表示打印出"倒数"和变量i的值。整个循环会执行5次,依次打印出"倒数1"、"倒数2"、"倒数3"、"倒数4"和"倒数5"。
done
#done是for循环的关键字,表示循环体结束
[root@LDP ~]# bash 3.sh
倒数1
倒数2
倒数3
倒数4
倒数5
使用seq输出1-8
[root@LDP ~]# cat 4.sh
for i in $( seq 1 8)
#这里就是将i作为一个变量,为后面的 seq 1 8 这个命令 seq命令就是会输出1到8的数字
do
#开始循环
echo $i
#开始输出i的变量 也就是seq 1 8
done
循环结束
[root@LDP ~]# bash 4.sh
1
2
3
4
5
6
7
8
使用限制条件来输出1-8
[root@LDP ~]# cat 4.sh
for (( i=1; i<=8; i++))
#在外面输入双括号,双括号在shell脚本里面应用为数学运算
#i=1 设置i初始等于1
#i<=8 设置i循环到8的时候停止。
#i++ 设置每次循环加1
do
echo $i
done
[root@LDP ~]# bash 4.sh
1
2
3
4
5
6
7
8
输出8-1
这里的话,也和上面的解释差不多,但是需要注意修改i的停止设置。
[root@LDP ~]# cat 4.sh
for (( i=8; i>=1; i--))
do
echo $i
done
[root@LDP ~]# bash 4.sh
8
7
6
5
4
3
2
1
使用反引号
for i in `seq 5`
do
echo ${i}
printf "${i}\n"
done
[root@ldpbzhaonan bash]$ bash for01.sh
1
1
2
2
3
3
4
4
5
5
这里就是使用反引号,变量i就是反引号的输出结果。
创建文件
for i in `seq 3`
do
touch ${i}-$RANDOM.txt
done
[root@ldpbzhaonan bash]$ ll
总用量 40
-rw-r--r-- 1 root root 0 3月 23 15:40 1-4942.txt
-rw-r--r-- 1 root root 0 3月 23 15:40 2-6796.txt
-rw-r--r-- 1 root root 0 3月 23 15:40 3-29009.txt
这里就是使用随机数字作为文件的名称
随机数字
[root@ldpbzhaonan bash]$ echo $RANDOM
11901
[root@ldpbzhaonan bash]$ echo $RANDOM
23387
[root@ldpbzhaonan bash]$ echo $RANDOM
4447
[root@ldpbzhaonan bash]$ echo $RANDOM
1050
[root@ldpbzhaonan bash]$ echo $RANDOM
27203
[root@ldpbzhaonan bash]$ echo $RANDOM
22449
花括号的使用
数字
[root@ldpbzhaonan bash]$ cat for03.sh
for i in {1..5}
do
echo ${i}
done
[root@ldpbzhaonan bash]$ bash for03.sh
1
2
3
4
5
这里就是将i的变量成为1到5 花括号里面的..代表1到5中间的数字,我们不用在一个一个输入了。
字母
[root@ldpbzhaonan bash]$ cat for04.sh
for i in {a..c}
do
echo ${i}
done
[root@ldpbzhaonan bash]$ bash for04.sh
a
b
c
这里也是将a到c中间的字母隐藏了
输出自定义的字符
[root@ldpbzhaonan bash]$ cat for07.sh
for i in file{a..c}.txt
do
printf "${i}\n"
done
[root@ldpbzhaonan bash]$ bash for07.sh
filea.txt
fileb.txt
filec.txt
创建文件
[root@ldpbzhaonan bash]$ cat for05.sh
for i in {1..5}
do
touch ${i}--$(date +%Y-%m-%d-%H:%M:%S).txt
done
[root@ldpbzhaonan bash]$ bash for05.sh
[root@ldpbzhaonan bash]$ ll
总用量 52
-rw-r--r-- 1 root root 0 3月 23 16:20 1--2024-03-23-16:20:42.txt
-rw-r--r-- 1 root root 0 3月 23 16:20 2--2024-03-23-16:20:42.txt
-rw-r--r-- 1 root root 0 3月 23 16:20 3--2024-03-23-16:20:42.txt
-rw-r--r-- 1 root root 0 3月 23 16:20 4--2024-03-23-16:20:42.txt
-rw-r--r-- 1 root root 0 3月 23 16:20 5--2024-03-23-16:20:42.txt
这里就是将i作为1到5的变量,创建名称开头为1到5的文件,后面结合使用时间。
不带列表的for循环
[root@ldpbzhaonan bash]$ cat for06.sh
for i in 1 2 3
do
printf '$i==>'
printf "${i}\n"
done
[root@ldpbzhaonan bash]$ bash for06.sh
$i==>1
$i==>2
$i==>3
这里就是使用了printf的不自动换行的机制,首先会输出$i==>,之后再此基础上输出1,之后换行,,再次输出$i==>,在此后面输出2,以此类推。
类似C语言的风格
for后边用(())两层双括号括住条件,条件之间用;分号隔开,然后用do和done。
设置条件
[root@ldpbzhaonan bash]$ cat for08.sh
for (( i=1;i<=4;i++))
do
echo ${i}
done
[root@ldpbzhaonan bash]$ bash for08.sh
1
2
3
4
这里就是在双圆括号里面设定条件初始 i等于1,之后设置条件i只能小于等于4,之后每循环以此i+
for的IFS
for循环的运作方式,是将串行的元素意义取出,依序放入指定的变量中,然后重复执行命令区域(在do和done 之间),直到所有元素取尽为止。
其中,串行是一些字符串的组合,彼此用$IFS所定义的分隔符(如空格符)隔开,这些字符串称为字段。
IFS
IFS(Internal Field Seperator)在Linux的shell中预设的内部字段分隔符,用来把command line分解成word(字段)。
IFS可以是White Space(空白键)、Tab( 表格键)、Enter( 回车键)中的一个或几个。
IFS是shell脚本中的一个重要概念,在处理文本数据时,它是相当有用的。内部字段分隔符是用于特定用途的定界符。IFS是存储定界符的环境变量,它是当前shell环境使用的默认定界字符串。IFS的设置方法很简单,和普通变量设置方法类似:IFS=":"
建议设置IFS前保存原IFS的值,在使用后及时恢复。
例子一
[root@ldpbzhaonan bash]$ cat for09.sh
echo $IFS
#这里使用了IFS的默认变量为空白
data="name,sex,age"
这里定义data的多个变量
old=$IFS
这里使用old为IFS的变量
IFS=","
设置IFS在此脚本的分割符为逗号。
for i in $data
do
echo $i
done
[root@ldpbzhaonan bash]$ bash for09.sh
name
sex
age
例子二
[root@ldpbzhaonan bash]$ cat for10.sh
IFS=$oldIFS
oldIFS=${IFS}
printf '$IFS==>'
printf "${oldIFS}"
data="name,age,sex,address,favourite"
IFS=","
printf '$IFS==> '
printf "${IFS}"
for i in ${data}
do
echo '$i' == ${i}.
done
IFS=${oldIFS}
[root@ldpbzhaonan bash]$ bash for10.sh
$IFS==>$IFS==> ,$i == name.
$i == age.
$i == sex.
$i == address.
$i == favourite.
例子三
使用IFS和不使用IFS的区别
使用IFS
[root@ldpbzhaonan bash]$ cat for10.sh
IFS=";"
ba=$IFS
data="aaa;bbb;ccc;ddd"
for i in ${data}
do
echo $i
done
[root@ldpbzhaonan bash]$ bash for10.sh
aaa
bbb
ccc
ddd
不使用IFS
[root@ldpbzhaonan bash]$ cat for10.sh
#IFS=";"
#ba=$IFS
data="aaa;bbb;ccc;ddd"
for i in ${data}
do
echo $i
done
[root@ldpbzhaonan bash]$ bash for10.sh
aaa;bbb;ccc;ddd
例子四(使用后及时恢复)
[root@ldpbzhaonan bash]$ cat for10.sh
old=${IFS}
#定义了IFS的的脚本里面变量为old。
IFS="."
#定义了IFS的变量为句号(.)
abcd="a.b.c.d"
echo $IFS
#输出IFS的默认空行
for i in ${abcd}
do
echo ${i}
done
IFS=${old}
#将IFS的变量恢复
#重新输出
for i in ${abcd}
do
echo ${i}
done
[root@ldpbzhaonan bash]$ bash for10.sh
a
b
c
d
a.b.c.d