【问题标题】:How to print echo statement in formatted as cat command in shell scripting?如何在 shell 脚本中以 cat 命令格式打印 echo 语句?
【发布时间】:2013-01-20 05:49:11
【问题描述】:
    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

【问题讨论】:

标签: linux shell unix awk echo


【解决方案1】:

您在最后一行中缺少引号:

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

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

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

还有,这是错误的

`rm -rf xyz.log`

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

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

【讨论】:

  • +1 因为这是您的特定问题的原因。另外,去掉 rm 命令行周围的刻度,考虑使用 $(command) 而不是反引号。
【解决方案2】:

-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

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

【讨论】:

  • for (( i=0; i&lt;n; ++i )) do echo -e "${x[i]} ---- ${y[i]} ---- ${z[i]} \n" &gt;&gt; xyz.log done o=cat xyz.log` echo $o` 我改变了它,但我仍然得到相同的输出。 **$ ./val.sh** 输入 n 3 ABC ---- MNO ---- RTY DEF ---- PQR ---- LKJ GHI ---- STQ ---- LDF
  • 在 xyz.log 中,输出之间有空行,但我希望它在程序结束时打印在输出中。
【解决方案3】:

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

我还建议只在文件末尾添加一个换行符 echo &gt;&gt; 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

【讨论】:

  • 嗯,我不知道这是怎么回事。我将使用 changed 代码编辑答案。很抱歉混淆了。
猜你喜欢
  • 2022-01-04
  • 2014-04-28
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
  • 2011-10-15
相关资源
最近更新 更多