循环不管在程序中还是脚本中都需要经常用到,在写shell脚本时,经常需要for进行100次循环。for 循环是固定循环,也就是在循环时已经知道需要进行几次循环。有时也把 for 循环称为计数循环。
Shell for循环语法
for 变量 in 列表 do command1 command2 ... commandN done**也可以写成:for var in list; do
读取列表中的值
#!/bin/bash #basic for command for linuxidc in Linux公社 Linuxmi linux Ubuntu do echo The next state is $linuxidc done执行结果:
linuxidc@linuxidc:~/linuxidc.com$ ./linuxidc.sh
The next state is Linux公社
The next state is Linuxmi
The next state is linux
The next state is Ubuntu
在最后一次迭代后,$linuxidc变量的值会在shell脚本的剩余部分保持有效。它会一直保持最后一次迭代的值(除非你已经修改了它)。
读取列表中的复杂值
有两种解决办法:
*使用转义字符(反斜线)来将单引号转移;
*使用双引号来定义用到单引号的值。
#!/bin/bash #basic for command for linuxidc in Kotlin Linuxmi\'com linux Ubuntu "CentOS'rhel" Oracle do echo The next state is $linuxidc done执行结果:
linuxidc@linuxidc:~/linuxidc.com$ ./linuxidc.sh
The next state is Kotlin
The next state is Linuxmi'com
The next state is linux
The next state is Ubuntu
The next state is CentOS'rhel
The next state is Oracle
*记住,for命令用空格来划分列表中的每个值。如果在单独的数据值中有空格,就必须用双引号将这些值圈起来。
从变量读取列表
将一系列的值都集中存储在一个变量中,然后需要遍历变量中的整个列表。
#!/bin/bash #using a variable to hold the list list="Linuxidc Linuxmi Ubuntu Fedora" #向已有列表中添加或拼接一个值 list=$list" success" for state in $list do echo "this word is $state" done执行结果:
linuxidc@linuxidc:~/linuxidc.com$ ./linuxidc.sh
this word is Linuxidc
this word is Linuxmi
this word is Ubuntu
this word is Fedora
this word is success
从命令读取值
有两种方式可以将命令输出赋值给变量:
(1)反引号字符(`)
(2)$()格式
例如:
linuxidc=`date`
linuxidc=$(date)
生成列表中所需值就是使用命令的输出。
#!/bin/bash # reading values from a file file="states" for state in $(cat $file) do echo "welcome $state" donestates文件内容;
Hello World
Linuxmi com
linuxidc.net Linux公社
执行结果:
linuxidc@linuxidc:~/linuxidc.com$ ./linuxidc.sh
welcome
welcome Hello
welcome World
welcome Linuxmi
更改字段分隔符
造成这个问题的原因是特殊的环境变量IFS,叫作内部字段分隔符。默认情况下,bash shell会将下列字符当作字段分隔符:
*空格
*制表符
*换行符
如果bash shell在数据中看到这些字符中的任意一个,它就会假定这表明了列表中一个新数据字段的开始。
想修改IFS的值,使其只能识别换行符,那就必须:
IFS=$'\n'