当我使用“ 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兼容。