Shell脚本总结-for循环

基本语法

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值