Using for
for l in $ ()
执行基于 IFS 的单词分割 :
$ for l in $(printf %b a b
c ); do echo "$l"; done
a
b
c
$ IFS=$
; for l in $(printf %b a b
c ); do echo "$l"; done
a b
c
如果IFS以后不使用,则不必退后。
for l in $()
还执行路径名扩展 :
$ printf %b a
*
> file.txt
$ IFS=$
$ for l in $(<file.txt); do echo "$l"; done
a
file.txt
$ set -f; for l in $(<file.txt); do echo "$l"; done; set +f
a
*
If IFS=$
, linefeeds are stripped and collapsed:
$ printf %b
a
b
> file.txt
$ IFS=$
; for l in $(<file.txt); do echo "$l"; done
a
b
$( cat file.txt)
(或 $( & lt; file.txt)
) 也将整个文件读成内存。
Using read
- 不使用 - r 反斜线用于连续线,并在其他字符之前删除:
$ cat file.txt
1\2
3
$ cat file.txt | while read l; do echo "$l"; done
123
$ cat file.txt | while read -r l; do echo "$l"; done
1\2
3
IFS 中的字符从线条的开始和结束处被剥除, 但没有倒塌 :
$ printf %b 1 2
3
| while read -r l; do echo "$l"; done
1 2
3
$ printf %b 1 2
3
| while IFS= read -r l; do echo "$l"; done
1 2
3
如果最后一行没有以新行结尾, 读取给它指定 l, 但会在循环正文前退出 :
$ printf x
y | while read l; do echo $l; done
x
$ printf x
y | while read l || [[ $l ]]; do echo $l; done
x
y
如果在管道中有一个循环, 它也在一个子贝壳中, 所以变量无法在外观 :
$ x=0; seq 3 | while read l; do let x+=l; done; echo $x
0
$ x=0; while read l; do let x+=l; done < <(seq 3); echo $x
6
$ x=0; x=8 | x=9; echo $x
0