我有一个包含以下内容的文件:
Hola qué tal
Yo \t muy bien
Un placer.
我想逐行读取它,将每一行的值保存在一个变量中以进行处理。
也就是说,我想要:
- 阅读第一行。
- 将值“Hello how are you”赋值给变量 $linea。
- 用
$linea
. - 阅读第二行。
- 将值“I \t very well”分配给
$linea
。
等等。
我有一个包含以下内容的文件:
Hola qué tal
Yo \t muy bien
Un placer.
我想逐行读取它,将每一行的值保存在一个变量中以进行处理。
也就是说,我想要:
$linea
.$linea
。等等。
使用
while ... do ... done < fichero
一些细微差别:这被解释为:
IFS=''
(或IFS=
)防止删除前导或尾随空格(空格或制表符)字符。-r
防止反斜杠 (\
) 被解释为特殊字符。|| [[ -n $linea ]]
如果最后一行不以结尾,则防止它被忽略\n
(因为它read
在遇到 EOF 时返回非零退出)。从理论上讲,一行应该以 POSIX 结尾\n
并且由 POSIX 定义如下:除换行符之外的零个或多个字符的序列,\n
后跟换行符。但是,可能会写入最后一行不包含它的文件;有了这个添加,该行也将被处理。因此,在您的文件中,我们将有以下输出:
让我们看看如果我们删除任何检查会发生什么:
没有
IFS=''
: 前导和尾随空格被删除。Sin
-r
enread
: 反斜杠被解释。Sin
|| [[ -n $linea ]]
: 假设的最后一行不以结尾\n
将不会被读取:给定上一个文件,如果我们添加一个新的字符系列而不
\n
结束:我们观察到它的内容是这样出现的:
当我们阅读时,最后一行没有被处理:
参考:
cat file | while IFS= read -r line; do … done