如何在shell脚本中打印格式为cat命令的echo语句?

时间:2013-01-20 05:49:11

标签: linux shell unix awk echo

    rm -rf xyz.log
    echo "Enter n"
    read n
    x[0]=ABC
    x[1]=DEF
    x[2]=GHI
    y[0]=MNO
    y[1]=PQR
    y[2]=STQ
    z[0]=RTY
    z[1]=LKJ
    z[2]=LDF
    for (( i=0; i<n; ++i ))
    do
      echo "${x[i]} ---- ${y[i]} ---- ${z[i]}" >> xyz.log
    done
    o=`cat xyz.log`
    echo $o

当我执行上面的脚本时,我将所有输出都放在一行中,但是在xyz.log中,它是逐行打印的。我希望在echo命令中打印相同的内容。提前谢谢。

$ ./val.sh

输入n

3

ABC ---- MNO ---- RTY DEF ---- PQR ---- LKJ GHI ---- STQ ---- LDF

$ cat xyz.log

ABC ---- MNO ---- RTY

DEF ---- PQR ---- LKJ

GHI ---- STQ ---- LDF

3 个答案:

答案 0 :(得分:3)

你在最后一行缺少引号:

o=`cat xyz.log`
echo "$o"
# ---^--^

添加引号将允许shell完全使用变量的内容。否则,你要求shell执行wordsplitting,其中任何空白序列(包括换行符)将被单个空格替换(默认情况下)。

经验法则:始终引用"$variables",除非您特别不想引用它们。

另外,这是错误的

`rm -rf xyz.log`

您正在子shell中执行删除,然后将输出用作命令。在这种情况下,没有输出,但你可以看到像这样的效果

`echo hi there` # -- command not found 'hi'

答案 1 :(得分:0)

-e选项用于启用echo对换行符的其他实例的解释以及其他特殊字符的解释,例如水平制表符,由\ t表示。因此,例如,以下将生成格式化输出:

echo -e "\n Projects: \n\n\tplan \n\tcode \n\ttest\n"

因此请使用您的echo命令,如:

echo -e "${x[i]} ---- ${y[i]} ---- ${z[i]} \n" >> xyz.log

它会起作用,并会给你你正在寻找的答案。

答案 2 :(得分:0)

使用-n上的echo选项。 -n表示“不要像往常一样在行尾写一个换行符。”它记录在bash手册页中。

我还建议只使用echo >> xyz.log将换行符放在文件的末尾。

OUTFILE = “xyz.log”

`rm -rf "$OUTFILE"`
echo "Enter n"
read n
x[0]=ABC
x[1]=DEF
x[2]=GHI
y[0]=MNO
y[1]=PQR
y[2]=STQ
z[0]=RTY
z[1]=LKJ
z[2]=LDF
for (( i=0; i<n; ++i )) ; do
    echo -n "${x[i]} ---- ${y[i]} ---- ${z[i]}" >> "$OUTFILE"
done
o=`cat "$OUTFILE"`
echo $o