我有一个bash数组OUTARRAY
,我将填充处理INARRAY
的值。我经常在OUTARRAY
特殊字符后面附加\t
和\n
因此可能看起来像:
OUTARRAY[j]="\n"
或者
OUTARRAY[j]="${INARRAY[i]}\t"
最后,我使用以下命令将
OUTARRAY
转储到文件中printf "%s" "${OUTARRAY[@]}" > ${OUTFILE}
但是,我得到的结果是一个单行文件,其中打印了所有特殊字符:
\n2771\t2899\t7624\t2911\t\n2772\t2904\t7706\t2911\t\n2771\t2909
相反,我想要按列输出。就像是
2771 2899 7624 2911
2772 2904 7706 2911
等等。
我做错了什么?
谢谢你
最佳答案
bash
不解释带引号的字符串中的C样式反斜杠转义符(\n
)。
相反,请使用bash
语法$'\n'
:
OUTARRAY[j]=$'\n'
OUTARRAY[j]="${INARRAY[i]}"$'\t'
如果先定义以下内容,则可能会使其更具可读性:
NL=$'\n'
TAB=$'\t'
然后您可以在双引号字符串中自由插入
${NL}
和${TAB}
。另外,您可以使用bash扩展名:
printf
通常以格式而不是参数扩展C样式的反斜杠转义符。但是,如果使用的是bash,则可以使用bash特定的%b
printf
格式,该格式会在相应的参数中扩展反斜杠转义符。我并不真正支持此解决方案,但无需其他修改即可使用:printf "%b" "${OUTARRAY[@]}" > ${OUTFILE}
顺便说一句,对bash变量名称使用ALL CAPS并不是一种好的样式,因为它增加了它们与bash/特定于系统的环境变量发生冲突的可能性。
关于arrays - 将bash数组(包含字符串和特殊字符)写入文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23957848/