我有一个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/

10-16 23:55