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

时间:2014-05-30 15:12:34

标签: arrays bash

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

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

不插入字符串\t\n,而是插入实际标签和换行符:

outarray[j]=$'\n'
outarray[j]=${inarray[i]}$'\t'

现在这不是一个好策略。相反,不要将格式设置在数组中,而是使用printf格式化数组的显示方式:如果您希望每行4个字段,则用制表符分隔:

printf '%s\t%s\t%s\t%s\n' "${outarray[@]}"

(顺便说一句,我小写了你的变量名,它好多了。)

答案 2 :(得分:1)

其他答案是正确的方法,但可以按原样打印您的数据。您可以使用echo -ne和循环来打印您的值:

$ arr=( "a\t" "b\n" "c\t" "d\n" )
$ for i in "${arr[@]}"; do echo -ne $i; done
a       b
c       d

-n切换到echo会删除尾随换行符,-e表示将解释反斜杠转义字符。