您的位置:首页 > 运维架构 > Shell

第3章 shell结构化命令------------(C式的for循环)

2017-03-14 00:00 603 查看

3.4.2 读取变量与读取命令

Shell脚本中经常发生的是积累了存储于变量中的一个值列表,然后需要通过列表迭代。代码可以使用另一种赋值语句向包含在变量中大已存在列表添加(或连接)一条项目。

生成列表中使用的值的另一种方法是使用命令的输出。可以使用反引号(`)字符来执行生成输出的任何命令,然后在for命令中使用的输出。

#!/bin/bash
list="I SHE HE YOU IT ME HER MINE"
list=$list" YOUR"
#使用变量循环$uv
for uv in $list ;do
echo $uv
netstat -nltp | grep 8089 >./nstfile
done

#读取命令行的list
for st in `cat nstfile`;do
echo $st
done




3.4.3 改变字段分隔符与使用通配符读取目录

引起这个问题的原因是称为内部字段分隔符(Internal Field Separator,IFS) 的特殊环境变量。环境变量IFS定义了bash shell用作字段分隔符的字符列表。默认情况下,bash shell将下面的字符看作字段分隔符:空格、制表符、换行符。如果bashshell在数据中遇到这几种的一种或几种,就会被认为正在列表中启动新的数据字段。

要解决该问题,可以在shell脚本中暂时更改环境变量IFS的值,限制bashshell看作是字段分隔符的字符。如果想将IFS的值更改为只识别换行符:IFS=$'\n'。在脚本中添加这条语句,通知bash shell在数据值中忽略空格和制表符。

Warning:当使用较长的脚本时,可能在一个位置更改了IFS的值,但忘记了该值,并在脚本的其他地方假设为默认值。一个安全的做法是,在更改原始IFS值之前将它保存起来,当需要运用时即可开恢复

该技术可以写成如下代码:



这就确保了在接下来的脚本操作中,IFS值会返回默认值。如果想指定多个IFS字符,只需要将它们在赋值行中串连起来即可。IFS=$'\n':;"

该赋值使用了换行符、冒号、分号和双引号字符作为字段分隔符

#!/bin/bash
echo "字段分隔符为\\t"
IFS=$:
file=`ps`
for line in $file;do
echo $line
done

echo "字段分隔符为\\n"

IFS=$'\n'
for line in $file;do
echo $line
done




可以使用for命令自动迭代文件的目录。为此,必须在文件或路径名中使用通配符。这就迫使shell使用文件通配符。文件通配是生成与指定通配符匹配的文件或路径名的过程。可以在列表数据中输入任何值,即文件或目录不存在,for语句会试图处理放在列表中的任何东西。

3.4.5 C式的for命令

在C语言中,for循环通常定义一个变量,该变量在每次迭代过程中自动改变值。通常程序员将变量用作计数器,每次迭代计数器要么增加一个要么减少一个。

C语言中的for命令有一种特定的方法指定一个变量,即必须保持true值用于继续迭代的条件,和一种每次迭代改变变量的方法。当特定的条件变为false,for循环结束。条件式使用标准的数学符号定义。

bashshell也支持看起来与C式的for循环类似的for循环版本。bash中C式的for循环的基本格式:



注意,有几项不遵循标准bashshell的for方法:

Ø 变量的赋值可以包括空格

Ø 条件中的变量不以美元符号做前缀

Ø 迭代处理式不使用expr命令格式

for循环使用在for循环中定义的变量迭代命令。在每次迭代中,变量都包含for循环中分配的值。每次迭代之后,循环迭代过程就会应用到变量。

循环分别处理每个变量,允许为每个变量定义不同的迭代过程。虽然可以使用多个变量,但只可以在for循环中定义一个条件。

#!/bin/bash
#类似与C语言的for循环
for(( i=1 ;i<5 ;i++ ))
do
echo $i
done

for(( i=1 ,j=5;i<5 ;i++,j-- ))
do
echo $[$i+$j]
done


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐