shell脚本编程<四>:for命令
2016-01-03 19:12
651 查看
for命令
基本格式如下for var in do commands done
读取列表中的值
#!/bin/bash for test in Alabama Alaska Arizona Arkansas California Colorado do echo $test done
读取列表中的复杂值
注意如列表中,一些符号注意使用转义符来转义或双引号来表示,如
#!/bin/bash for test in i don\'t know if "this'll" work do echo $test done
如果想打印一些有空格的值,看一个栗子
#!/bin/bash for test in China "New York" do echo $test done
从变量中读取列表
shell脚本中经常发生的是积累了存储于变量中的一个值的列表,然后需要通过列表迭代,例如
list="Alabama Alaska Arizona Arkansas California Colorado" #以下为常用语句 list=$list" Connectioncut" for state in $list do echo $state done
读取命令中的值
生成列表中使用的值的另一种方法是使用命令的输出,见下
file="states" #千万注意反引号和单引号 for state in `cat $file` do echo $state done
其中states文件为: Alabana Alaska New York North Hampshire
会看到打印的值并不是你想要的
- 改变字段分割值
IFS:内部字段分割符。特殊的环境变量IFS定义了bash shell用作字段分割符的字符列表。默认情况下,bash shell将下面的字符看作字段分割符:
1. 空格
2. 制表符
3. 换行符
如果bash shell在数据中遇到这几种字符中的一种,它就会认为你正在列表中启动新的数据字段。当处理能够包含空格的是数据时,就会产生干扰,如前的示例所示。
要解决该问题,可以在shell脚本中暂时更改环境变量IFS的值,限制bash shell看作是字段分隔符的字符,如若只想将IFS的值更改为只识别换行符,需要这样做:
IFS=$’\n’
在脚本中添加这条语句后,通知bash shell在数据值中忽略空格和制表符。看下面的栗子
file="states" IFS=$'\n' for state in `cat $file` do echo $state done
警告:当使用较长的脚本时,可能在一个位置更改了IFS的值,但忘记了该值,并在脚本的其他地方假设为默认值。一个安全的做法是,在更改了原始IFS值之前将它保存起来,当需要运用时回复即可,如下
IFS.OLD=$IFS IFS=$'\n' <use the new IFS value in code> IFS=IFS.OLD
环境变量IFS有其他的很好应用,如果想迭代文件中用冒号分割的值(如在文件/etc/passwd中),需要做的就是将IFS设置为冒号:
IFS=:
如果想指定多个IFS字符,只需将它们在赋值行中串联起来即可
IFS=$’\n’:;”
该赋值使用了换号符、冒号、分号和双引号字符作为字段分割符。
- 使用通配符读取目录
可以使用for命令自动迭代文件的目录。如下
#!/bin/bash #rich为用户名 for file in /home/rich/test/* do if [ -d "$file" ] then echo "$file is a dir" elif [ -f "$file" ] then echo "$file is a file" fi done
注意在本例中对if语句测试中做了一些不同的处理,如
if [ -d "$file" ]
为什么呢?在Linux中,包含空格的路径和文件名是合法的。要容纳它们,应该使用双引号将变量$file包围起来。如果不这样做,遇到包含空格的路径或文件名就会出错
相关文章推荐
- linux shell--算术运算
- linux中shell变量$#,$@,$0,$1,$2的含义解释
- eval在MATLAB和Shell中的作用
- 编写你的shell其实很简单
- Window下使用Xshell连接VirtualBox中CentOS SSH最佳实践
- sed使用方法
- awk用法三
- awk用法二
- chapter11:认识与学习bash之(4)管道命令
- chapter11:认识与学习bash之(3)数据流重定向
- 如何把root登陆的shell改为csh?
- Xshell无法连接虚拟机Linux
- Shell编程实战 1.1 监控思路架构介绍
- How to use “svn add” recursively in Linux shell?
- Linux Shell 1>/dev/null 2>&1 &
- 写你的shell,其实很简单[架构篇]
- msf生成shellcode
- Shell编程进阶 2.2 shell数组
- 编写你的shell其实很简单
- Shell编程进阶 2.1 shell函数