2013-03-02 50 views
1

我需要运行一个bash脚本来生成bash数组,并以某种方式将此数组返回给bash调用脚本。返回到调用脚本的结果数组在每个方面都必须与原始数组相同:不需要特别处理字符(如空格)。而且,脚本必须是单独的过程,因为我无法在前者的背景下执行其他脚本。将数组转换为字符串并返回,而不会丢失信息

由于bash函数无法在没有黑客的情况下接受或返回数组,因此更加困难。尽管对数组进行编码/解码可能很复杂,但是最简单的(最少编码)还是最快的(执行速度)方法呢?

+1

而你要在随身携带的是什么呢你阵列? – Rubens 2013-03-02 13:57:20

回答

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

谢谢,这真是太棒了,我并不完全接受这将被构建到bash中。 – 2013-03-02 21:20:45

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 
相关问题