linuxshellfor循环变量,shellfor循环总结1 shell for循环语法
for 变量 in 列表
do
command1
command2
...
commandN
done
1.1 读取列表中的值
#!/bin/bash
for test in apple boy cat dog
do
echo The next state is $test
done
结果:
The next state is apple
The next state is boy
The next state is cat
The next state is dog
1.2 读取列表中的复杂值
有两种解决办法:
linux循环执行命令脚本
#使⽤转义字符(反斜线)来将单引号转移;
#使⽤双引号来定义⽤到单引号的值。
#!/bin/bash
for test in I don\'t think if "this'll" work
do
echo The next state is $test
done
结果是:
The next state is I
The next state is don't
The next state is think
The next state is if
The next state is this'll
The next state is work
*记住,for命令⽤空格来划分列表中的每个值。如果在单独的数据值中有空格,就必须⽤双引号将这些值圈起来。
1.3 从变量读取列表
将⼀系列的值都集中存储在⼀个变量中,然后需要遍历变量中的整个列表。
#!/bin/bash
list="helllo world"
#向已有列表中添加或拼接⼀个值
list=$list" ok"
for state in $list
do
echo "this word  is $state"
done
结果是:
this word is helllo
this word  is world
this word  is ok
1.4 从命令读取值
有两种⽅式可以将命令输出赋值给变量:
(1)反引号字符(``)
(2)$()格式
如:
for i in $(who)
do
echo "visit beautiful $i"
done
输出结果:
visit beautiful etldev
visit beautiful pts/0
visit beautiful 2019-05-15
visit beautiful 09:31
visit beautiful (112.64.161.227)
visit beautiful root
visit beautiful pts/1
visit beautiful 2019-05-09
visit beautiful 07:41
visit beautiful (10.1.1.62)
visit beautiful etldev
visit beautiful pts/3
visit beautiful 2019-05-15
visit beautiful 09:34
visit beautiful (112.64.161.227)
visit beautiful etldev
visit beautiful pts/4
visit beautiful 2019-05-15
visit beautiful 10:49
visit beautiful (112.64.161.227)
*who默认输出当前登录的所有⽤户的信息如下所⽰
etldev pts/0        2019-05-15 09:31 (112.64.161.227)
root    pts/1        2019-05-09 07:41 (10.1.1.62)
etldev  pts/3        2019-05-15 09:34 (112.64.161.227)
etldev  pts/4        2019-05-15 10:49 (112.64.161.227)
1.5 更改字段分隔符
造成这个问题的原因是特殊的环境变量IFS,叫作内部字段分隔符。默认情况下,bash shell会将下列字符当作字段分隔符:*空格
*制表符
*换⾏符
如果bash shell在数据中看到这些字符中的任意⼀个,它就会假定这表明了列表中⼀个新数据字段的开始。
想修改IFS的值,使其只能识别换⾏符,那就必须:
IFS=$'\n'
将这个语句加⼊到脚本中,告诉bash shell在数据值中忽略空格和制表符。
⼀个可参考的安全实践是在改变IFS之前保存原来的IFS值,之后再恢复它。
实现:
IFS.OLD=$IFS
IFS=$'\n'
IFS=$IFS.OLD
这就保证了在脚本的后续操作中使⽤的是IFS的默认值。
遍历⼀个⽂件中⽤冒号分隔的值:
IFS=:
如果要指定多个IFS字符,只要将它们在赋值⾏串起来就⾏。
IFS=$'\n':;"
这个赋值会将换⾏符、冒号、分号和双引号作为字段分隔符。如何使⽤IFS字符解析数据没有任何限制。
1.6 ⽤通配符读取⽬录
for file in /proc/*;
do
echo $file is file path \! ;
done
2 类C风格for循环的语法格式
for((expr1; expr2; expr3))
do
command
command
...
done
有些部分并没有遵循bash shell标准的for命令:
*变量赋值可以有空格
*条件中的变量不以美元符开头
*迭代过程的算式为⽤expr命令格式
#!/bin/bash
#使⽤类C风格for循环输出1~5
for ((integer = 1; integer <= 5; integer++))
do
echo "$integer"
done
结果:
1
2
3
4
5
使⽤类C风格for循环要注意以下事项:
a.如果循环条件最初的退出状态为⾮0,则不会执⾏循环体

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。