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
答案 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