我有一个bash数组OUTARRAY,我填充将处理一个值INARRAY.我经常追加到OUTARRAY特殊字符,即\t并\n
因此它可能看起来像:
OUTARRAY[j]="\n"
Run Code Online (Sandbox Code Playgroud)
要么
OUTARRAY[j]="${INARRAY[i]}\t"
Run Code Online (Sandbox Code Playgroud)
最后我将OUTARRAY文件转储到文件中
printf "%s" "${OUTARRAY[@]}" > ${OUTFILE}
Run Code Online (Sandbox Code Playgroud)
然而,我得到的结果是,单行文件中打印了所有特殊字符:
\n2771\t2899\t7624\t2911\t\n2772\t2904\t7706\t2911\t\n2771\t2909
Run Code Online (Sandbox Code Playgroud)
相反,我想要圆柱输出.就像是
2771 2899 7624 2911
2772 2904 7706 2911
Run Code Online (Sandbox Code Playgroud)
等等.我做错了什么?谢谢
bash不会\n在引用的字符串中解释C样式的反斜杠转义().
相反,使用bash语法$'\n':
OUTARRAY[j]=$'\n'
OUTARRAY[j]="${INARRAY[i]}"$'\t'
Run Code Online (Sandbox Code Playgroud)
如果您从定义开始,您可能会发现它更具可读性:
NL=$'\n'
TAB=$'\t'
Run Code Online (Sandbox Code Playgroud)
然后你可以插入${NL}并${TAB}自由插入双引号字符串.
或者,您可以使用bash扩展名:
printf通常以格式扩展C样式的反斜杠转义,但不在参数中扩展.但是,如果您使用的是bash,则可以使用特定于bash的%b printf格式,该格式会在相应的参数中扩展反斜杠转义.我并不认可这个解决方案,但它应该没有其他修改:
printf "%b" "${OUTARRAY[@]}" > ${OUTFILE}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,对于bash变量名使用ALL CAPS并不是一个好方法,因为它增加了它们与bash /特定于系统的环境变量冲突的可能性.
而不是插入字符串,\t或\n插入实际标签和换行符:
outarray[j]=$'\n'
outarray[j]=${inarray[i]}$'\t'
Run Code Online (Sandbox Code Playgroud)
现在这不是一个好策略.相反,不要将格式设置在数组中,而是用于printf格式化数组的显示方式:如果每行需要4个字段,请用制表符分隔:
printf '%s\t%s\t%s\t%s\n' "${outarray[@]}"
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,我降低了你的变量名,它好多了).