shell中如何逐行读取?
在ubuntu下测试。
准备2个文件:
$ cat cfg
line1_a line1_b
line2_a line2_b
line3_a line3_b$ cat cfg.newline
line1_a line1_b
line2_a line2_b
line3_a line3_b
注:cfg最后一行是没有换行符的,cfg.newline最后一行是有换行符中。
即hexdump -C cfg
和hexdump -C cfg.newline
两个命令对比可以发现,
cfg.newline最后是’0x0a’(换行符)。
shell脚本read_file.sh 如下:
#!/bin/bash
echo "FUNC: while read l" # OK
while read l
do
echo "line :"$l
done < $1
echo "FUNC: cat while read l" # OK
cat $1 | while read l
do
echo "line :"$l
done
echo "----------"
echo "FUNC: while line" # OK
while l=$(line)
do
echo "line :"$l
done < $1
echo "FUNC: cat while line" # OK
cat $1 | while l=$(line)
do
echo "line :"$l
done
echo "----------"
echo "FUNC: for l in cat file" # IN VAIN
for l in `cat $1`
do
echo "line:"$l"(end)"
done
echo "FUNC: for l in file" # IN VAIN
for l in $(cat $1)
do
echo "line:"$l"(end)"
done
运行如下:
$ /bin/bash read_file.sh cfg
FUNC: while read l
line :line1_a line1_b
line :line2_a line2_b
FUNC: cat while read l
line :line1_a line1_b
line :line2_a line2_b
----------
FUNC: while line
line :line1_a line1_b
line :line2_a line2_b
FUNC: cat while line
line :line1_a line1_b
line :line2_a line2_b
----------
FUNC: for l in cat file
line:line1_a(end)
line:line1_b(end)
line:line2_a(end)
line:line2_b(end)
line:line3_a(end)
line:line3_b(end)
FUNC: for l in file
line:line1_a(end)
line:line1_b(end)
line:line2_a(end)
line:line2_b(end)
line:line3_a(end)
line:line3_b(end)
$ /bin/bash read_file.sh cfg.newline
FUNC: while read l
line :line1_a line1_b
line :line2_a line2_b
line :line3_a line3_b
FUNC: cat while read l
line :line1_a line1_b
line :line2_a line2_b
line :line3_a line3_b
----------
FUNC: while line
line :line1_a line1_b
line :line2_a line2_b
line :line3_a line3_b
FUNC: cat while line
line :line1_a line1_b
line :line2_a line2_b
line :line3_a line3_b
----------
FUNC: for l in cat file
line:line1_a(end)
line:line1_b(end)
line:line2_a(end)
line:line2_b(end)
line:line3_a(end)
line:line3_b(end)
FUNC: for l in file
line:line1_a(end)
line:line1_b(end)
line:line2_a(end)
line:line2_b(end)
line:line3_a(end)
line:line3_b(end)
结论
1.
while read l
do
echo "line :"$l
done < $filename
和
cat $filename | while read l
do
echo "line :"$l
done
这种方式可以逐行读取文件,但不能读取没有换行符的最后一行。
且$l会去除该行前后所有空格,中间多个空格会换成1个空格。
2.
for l in `cat $1`
do
echo "line:"$l"(end)"
done
只能读取一个个空格或者换行分开的串,不是逐行读取。