2013-03-02 73 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 
相關問題