文章目录
for的列表循环
1)循环体前用in,循环体用{ }大括号括起来,然后用do和done。
2)不带列表的for循环,for后直接跟条件,然后用do和done。
3)类C风格的for循环,for后边用(())两层双括号括住条件,条件之间用;分号隔开,然后用do和done。
#!/bin/bash #打印1~5的for语句 for i in {1..5};do #数字段形式 echo $i done for i in 1 2 3 4 5;do #详细列出(字符且项数不多) echo $i done for ((i=1;i<=5;i++));do #((语法循环--有点像C语法,但记得双括号 echo $i done for i in `seq 5`;do #seq形式 起始从1开始,sequence序列 echo $i done
#!/bin/bash #for in语句与` `和$( )合用,利用` `或$( )的将多行合为一行的缺陷,实际是合为一个字符串数组 for i in `ls`;do echo $i done #robot test2.sh test.sh workspace for i in $(ls);do echo $i done #robot test2.sh test.sh workspace #打印当前目录下的.sh文件 for i in $(ls *.sh);do echo $i done #--->test.sh test2.sh #打印当前目录下的.sh文件 for i in *.sh;do #"*.sh"不是命令,不需要与``,$()来联合使用,若用就会出错 echo $i done #--->test.sh test2.sh for i in ls ;do #若是命令而不与``,$()来联合使用,就只会打印命令 echo $i done #-->ls for i in f1 f2 f3 ;do echo $i done #-->f1 f2 f3 LIST="root usr data data2" #打印除带有空格的字符串 for d in $LIST;do #用for in语句自动对字符串按空格遍历的特性,对多个目录遍历 echo $d done #--->root usr data data2 #打印出/var/log/路径下的所有文件和文件夹,注意有路径 for i in /var/log/*;do echo $i done #-->/var/log/yum.log /var/log/httpd ... #--打印当前目录下的文件名和文件夹名,注意是没有路径的 for i in *;do echo $i done #-->workspace test.sh group1 test2.sh
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的值,在使用后及时恢复
#!/bin/bash echo $IFS #-->输出为空白,IFS的默认值为空白(换行符,tab、制表符或者空格) data="name,sex,age" ##我们可以使用IFS读取变量中的每一个条目 oldIFS=$IFS IFS="," echo $IFS ##-->输出为空白,,因为起隔离作用,而不是普通的逗号 for i in $data;do echo $i done IFS=$oldIFS #-->name #-->sex #-->age