将bash数组(字符串和特殊字符)写入文件

nas*_*ass 5 arrays bash

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

等等.我做错了什么?谢谢

ric*_*ici 5

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 /特定于系统的环境变量冲突的可能性.


gni*_*urf 5

而不是插入字符串,\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)

(顺便说一句,我降低了你的变量名,它好多了).