加载中…
个人资料
枝叶飞扬
枝叶飞扬
  • 博客等级:
  • 博客积分:0
  • 博客访问:6,444
  • 关注人气:218
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

bash  read 背后的故事二:read -r

(2013-10-29 11:57:20)
标签:

read

bash

-r

readbyline

it

分类: linux

读取文件的首行并赋值给变量


$ read -r line < file


这一行命令用到了 Bash 的内置命令read,和输入重定向操作符<</code>。read命令从标准输入中读取一行,并将内容保存到变量line中。在这里,-r选项保证读入的内容是原始的内容,意味着反斜杠转义的行为不会发生。输入重定向操作符< file打开并读取文件file,然后将它作为read命令的标准输入。


记住,read命令会删除包含在IFS变量中出现的所有字符,IFS 的全称是 Internal Field Separator,Bash 根据 IFS 中定义的字符来分隔单词。在这里,read命令读入的行被分隔成多个单词。默认情况下,IFS包含空格,制表符和回车,这意味着开头和结尾的空格和制表符都会被删除。如果你想保留这些符号,可以通过设置IFS为空来完成:


$ IFS= read -r line < file

IFS 的变化仅会影响当前的命令,这行命令可以保证读入原始的首行内容到变量line中,同时行首与行尾的空白字符被保留。

4. 依次读入文件每一行


$ while read -r line; do 

 # do something with $line 

done < file

这是一种正确的读取文件内容的做法,read命令放在while循环中。当read命令遇到文件结尾时(EOF),它会返回一个正值,导致循环判断失败终止。
记住,read命令会删除首尾多余的空白字符,所以如果你想保留,请设置 IFS 为空值:

$ while IFS= read -r line; do 

 # do something with $line 

done < file

如果你不想将< file放在最后,可以通过管道将文件的内容输入到 while 循环中:

$ cat file | while IFS= read -r line; do 

 # do something with $line 

done



读取文件首行前三个字段并赋值给变量


$ while read -r field1 field2 field3 throwaway; do
    # do something with $field1, $field2, and $field3
done < file

如果在read命令中指定多个变量名,它会将读入的内容分隔成多个字段,然后依次赋值给对应的变量,第一个字段赋值给第一个变量,第二个字段赋值给第二个变量,等等,最后将剩余的所有字段赋值给最后一个变量。这也是为什么,在上面的例子中,我们加了一个throwaway变量,否则的话,当文件的一行大于三个字段时,第三个变量的内容会包含所有剩余的字段。
有时候,为了书写方便,可以简单地用_来替换throwaway变量:

$ while read -r field1 field2 field3 _; do
    # do something with $field1, $field2, and $field3
done < file

又或者,如果你的文件确实只有三个字段,那可以忽略它:

$ while read -r field1 field2 field3; do
    # do something with $field1, $field2, and $field3
done < file

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有