将数组转换为字符串并返回,而不会丢失信息

时间:2013-03-02 13:28:29

标签: arrays string bash shell

我需要运行一个生成bash数组的bash脚本,并以某种方式将此数组返回给bash调用脚本。返回到调用脚本的结果数组在每个方面都必须与原始数组相同:不要特别处理任何字符(如空格)。此外,脚本必须是单独的进程,因为我无法在前者的上下文中执行其他脚本。

由于bash函数无法接受或返回没有黑客攻击的数组,因此更加困难。尽管对阵列进行编码/解码,这可能是复杂和缓慢的,但最简单(最少编码)或最快(执行速度)的方法是什么?

2 个答案:

答案 0 :(得分:4)

给定一个数组 - 关联与否:

$ typeset -a array
$ array=({1..10})

您的序列化数组将由以下人员提供:

$ typeset -p array
declare -a array='([0]="1" [1]="2" [2]="3" [3]="4" \
    [4]="5" [5]="6" [6]="7" [7]="8" [8]="9" [9]="10")'

这将在即将进行时同时工作,因为typeset/declare -p name为您提供了声明变量的确切构造命令。

结果是带有声明本身的字符串,您可以从中重新计算的数组 - 使用GNU bash,版本4.2.24进行测试:

$ declaration=$(typeset -p array)
$ eval ${declaration}

答案 1 :(得分:1)

另一种干净利落的方法是使用NUL分隔的流,其优点是您可以从bash以外的语言和工具中读取它。要生成该流:

printf '%s\0' "${your_array[@]}"

......并且,请阅读:

your_array=()
while IFS='' read -r -d '' entry; do
  your_array+=( "$entry" )
done

这样做的好处是不需要生成数据的代码可信,就像使用eval一样。


对于关联或稀疏数组,可以发出对:

for key in "${!your_array[@]}"; do
  printf '%s\0' "$key" "${your_array[$key]}"
done

...而且,对于回读:

declare -A your_array # if associative
while IFS='' read -r -d '' key && IFS='' read -r -d '' value; do
  your_array["$key"]="$value"
done