当我使用“ cat test.file”时,它将显示
1
2
3
4
当我使用Bash文件时,
cat test.file |
while read data
do
echo "$data"
done
它会显示
1
2
3
4
我怎样才能像原始测试文件一样得到结果?
Answers:
IFS=''
cat test.file |
while read data
do
echo "$data"
done
我意识到您可能已经从确实需要管道的东西简化了示例,但是在其他人说之前:
IFS=''
while read data; do
echo "$data"
done < test.file
while IFS= read data; ...
export IFS...,很好,我读过你的小费!
IFS= read -r line以避免解释反斜杠。
只是为了补充DigitalRoss的响应。
对于只想为此命令更改IFS的情况,可以使用花括号。如果这样做,则仅在块内部更改IFS的值。像这样:
echo '
word1
word2' | { IFS='' ; while read line ; do echo "$line" check ; done ; }
输出将是(保留空格):
word1 check
word2 check
IFS已经解决了这个特定示例,您仍然应该引用"$line"。在一个真实的示例中,该值仍可以包含shell通配符,而不能包含通配符。
IFS='' read -r line,而不是! 在您的示例中,Pipe{..}在子外壳中运行!像IFS=' '; ( IFS='' ); echo "=$IFS="哪个打印= =(请注意SPC)。对比IFS=' '; { IFS=''; }; echo "=$IFS="打印==(来自的IFS {..})。但是,我还是建议:fullread() { local IFS=''; read -r $1; }或IFS='' read -r line(没有;' between IFS =''`和read。在shellVAR=val cmd args..中,您仅需更改一条命令的环境(这也适用于内置命令read,也是如此)
cat -etv <<<"$IFS" ; echo word1 | { IFS=''; cat -etv <<<"$IFS" ; } ; cat -etv <<<"$IFS" ;。子外壳程序没有像我期望的那样更改块外的IFS。你能详细说明吗?
也许IFS是其他人所说的重点。您只需IFS=在while和之间添加read。
cat test.file |
while IFS= read data
do echo "$data"
done
并且不要忘记的引号$data,否则echo会缩小空格。
但是正如Joshua Davies所提到的,您可能更喜欢使用预定义的变量$REPLY。
{ i=0; while read; do i=$(dc 1 $i + p); printf "%4 d $REPLY\n" $i; done; }它与旧版SH兼容。