我希望能读取一个包含多行内容的文件,并且原样输出。但是在AIX系统中,我的IFS换行符并没有按照预期工作。
以下是我的脚本:
#!/bin/ksh
#set -x
old_IFS=$IFS # save the field separator
IFS=$'\n'
LABELFILE=/home/david/label.txt
OUTPUT_FILE=/home/david/label_out.txt
for i in $(cat $LABELFILE)
do
echo "$i" >> $OUTPUT_FILE
done
label.txt
Hello nancy
naghu naghu
Hello navy
You are naughty
Good niece
我的输出文件(label_out.txt ->
Hello
a
cy
aghu
aghu
Hello
avy
You are
aughty
Good
iece
预期输出->
Hello nancy
naghu naghu
Hello navy
You are naughty
Good niece
\n
表示反斜杠和字母 n。在双引号内,它可能表示换行符,但通常不会(除了在bash
中)。 - Jonathan Leffler'\n'
的问题(对于这个问题,您有解决方法),整个for i in $(cat $file)
的写法非常奇怪。使用read
加上I / O重定向会更好(请注意,您强制shell将整个文件读入内存,然后一次输出一行,而不是让其一次读取一行。) - Jonathan Lefflerread
内置函数需要在每次执行后将文件指针放在正确的位置,因此它往往会进行更多的系统调用(当从管道读取时,需要逐字节读取,而且在从其他类型的文件读取时也经常发生)。如果文件足够大,以至于从cat
派生的开销可以分摊,并且足够小,可以轻松地将其放入内存中,则使用for i in $(cat $file)
方法可能更快。 - jilles