0
    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

$猫xyz.log

ABC ---- MNO ---- RTY

DEF ---- PQR ---- LKJ

GHI ---- STQ ---- LDF

4

3 回答 3

3

您在最后一行缺少引号:

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

添加引号将允许 shell 准确地使用变量的内容。否则,您将要求 shell 执行分词,其中任何空格序列(包括换行符)都将替换为单个空格(默认情况下)。

经验法则:总是引用"$variables",除非你特别不想引用它们。

另外,这是错误的

`rm -rf xyz.log`

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

`echo hi there` # -- command not found 'hi'
于 2013-01-20T13:54:06.557 回答
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

它可以解决问题,并为您提供您正在寻找的答案。

于 2013-01-20T05:58:37.797 回答
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
于 2013-01-20T06:22:30.093 回答