Shell脚本中的while和for循环
在日常工作中,学会使用shell编程,可以在很大程度上替代手工重复性质的工作,提高工作效率。从这点上来说,理解shell中循环的写法非常关键。下面详情shell中的while循环和for循环。
1、两种循环基本写法
常见的while和for循环的写法,大概有如下几种:
(1) 通过输入重定向到while循环
while read linedoecho $linedone < file(待读取的文件)
(2) 通过cat命令输出重定向到while循环
cat file(待读取的文件) | while read linedoecho $linedone
(3) for循环读取命令输出
for line in `cat file(待读取的文件)`doecho $linedone
2、两种循环的区别
按照我的了解,精确的说,上面例子中while和for循环的区别在于:while循环会将每行的内容读入到line变量;for循环中,将读入的内容以IFS(shell中的环境变量,Internal Field Seperator,字段分隔符)为界分隔,而后将各个分隔开的内容,逐一读入变量line。本质上说,for循环读取的是字段,只不过可以设置IFS为\n
这样能够逐行读取。
为了方便测试,我们用echo命令来实现多行文字的输出。其中,echo命令的-e
选项,意思就是可以识别转义字符能够输出行分隔符。如下例:
$ echo -e "a 12\nb 10"a 12b 10$
(1) while逐行读文件
$ echo -e "a 12\nb 10" | while read line> do> echo $line> donea 12b 10$
(2) for循环的默认行为
$ for line in `echo -e "a 12\nb 10"`> do> echo $line> donea12b10$
(3) 通过改变IFS实现for循环按行读入
$ IFS=$'\n'$ for line in `echo -e "a 12\nb 10"`> do> echo $line> donea 12b 10$
除了上面常见循环的写法,while循环在逐行读入的同时,还能够根据IFS将整行的内容分隔成多个字段,依次赋值给read后跟的变量名。假如变量数目多余字段的实际个数,少的那些变量值为空;假如变量的数目少于字段实际个数,最后一个变量对所有后面的字段照单全收。下面是一个例子:
$ echo -e "Tom 13\nLily 10 120cm\nJohn" | while read name age> do> echo "${name}: ${age}"> doneTom: 13Lily: 10 120cmJohn: $
3、一个简单的shell循环应用
假定有这样一个场景,需要在一个目录中,查找好多关键词。假如用shell搞定,我们就需要先将待搜索的关键词写入一个文件,比方keyword.txt,每行一个关键词。而后,写一个脚本读这个文件,取出每个关键词,而后用grep命令查找。下面是一个参考脚本的例子:
keyword_file='keyword.txt'search_dir='/xx/path/'result_file=result.txtecho "Results:" | tee $result_filecat $keyword_file | while read keyworddo echo "${keyword}:" | tee -a $result_file #word match, recursively search in directory and sub directory. only .java file will be searched. case insensitive. -l means only list file name grep -irw --include="*.java" "$keyword" "$search_dir" -l | tee -a $result_file echo "" | tee -a $result_filedone
运行结果如下:
$ cat keyword.txt PolymerizeSortMetaDataTube$ sh search.sh Results:Polymerize:/xx/path//src/com/poly/merge/test/TestMergeSortDesc.java/xx/path//src/com/poly/merge/test/TestMergeSortDescMultiSort.java/xx/path//src/com/poly/merge/basic/Polymerize.javaSortMeta:/xx/path//src/com/poly/merge/test/TestMergeSort.java/xx/path//src/com/poly/merge/test/TestMergeSort16.javaDataTube:/xx/path//UnitTest/com/poly/merge/basic/PolymerizeTest.java/xx/path//src/com/poly/merge/test/TestMergeSort.java/xx/path//src/com/poly/merge/test/DataTubeImp16.java/xx/path//src/com/poly/merge/basic/Polymerize.java/xx/path//src/com/poly/merge/basic/DataTube.java$
参考资料
- Shell编程中while与for的区别及用法详解
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Shell脚本中的while和for循环