我需要运行一个bash脚本来生成bash数组,并以某种方式将此数组返回给bash调用脚本。返回到调用脚本的结果数组在每个方面都必须与原始数组相同:不需要特别处理字符(如空格)。而且,脚本必须是单独的过程,因为我无法在前者的背景下执行其他脚本。将数组转换为字符串并返回,而不会丢失信息
由于bash函数无法在没有黑客的情况下接受或返回数组,因此更加困难。尽管对数组进行编码/解码可能很复杂,但是最简单的(最少编码)还是最快的(执行速度)方法呢?
我需要运行一个bash脚本来生成bash数组,并以某种方式将此数组返回给bash调用脚本。返回到调用脚本的结果数组在每个方面都必须与原始数组相同:不需要特别处理字符(如空格)。而且,脚本必须是单独的过程,因为我无法在前者的背景下执行其他脚本。将数组转换为字符串并返回,而不会丢失信息
由于bash函数无法在没有黑客的情况下接受或返回数组,因此更加困难。尽管对数组进行编码/解码可能很复杂,但是最简单的(最少编码)还是最快的(执行速度)方法呢?
给定一个阵列 - 联想与否:
$ 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}
谢谢,这真是太棒了,我并不完全接受这将被构建到bash中。 – 2013-03-02 21:20:45
另一种方式来做到这一点干净地是用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
而你要在随身携带的是什么呢你阵列? – Rubens 2013-03-02 13:57:20