我需要运行一个生成bash数组的bash脚本,并以某种方式将此数组返回给bash调用脚本。返回到调用脚本的结果数组在每个方面都必须与原始数组相同:不要特别处理任何字符(如空格)。此外,脚本必须是单独的进程,因为我无法在前者的上下文中执行其他脚本。
由于bash函数无法接受或返回没有黑客攻击的数组,因此更加困难。尽管对阵列进行编码/解码,这可能是复杂和缓慢的,但最简单(最少编码)或最快(执行速度)的方法是什么?
答案 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