我需要運行一個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