用包含空格的字串填滿 bash 數組,從類似數組讀取條目

用包含空格的字串填滿 bash 數組,從類似數組讀取條目

我讀過幾篇文章,討論如何填充 Bash 數組,其中每個條目都有空格。我相信我已經成功了。

我需要做的是在循環中執行此操作,用每次迭代中所有數組的內容填充更大的數組。

因此,我有一個外循環迭代從另一個腳本獲得的數組的條目。在該循環的每次迭代中,我運行一個產生多行輸出的命令行,並且我希望每一行都是數組條目。我必須將所有這些數組條目添加到“摘要”數組中。由於我不知道如何“將此數組的內容附加到另一個數組”,因此我認為我必須迭代較小的數組。到目前為止,這正在做我需要的事情。但是,對較大數組的追加似乎無法正常運作。在我執行此操作後,附加到較大的數組並檢查較大數組的長度,它始終只是“1”。

腳本的相關部分大約是這樣的:

nslist=$(...)
pnarray=()
for ns in $nslist; do
    IFS=$'\n' nspnarray=($(...))
    echo "nspnarray.len[${#nspnarray[@]}]" # This looks fine
    for pn in ${nspnarray[@]}; do
        echo "pn[$pn]" # This looks fine
        IFS=$'\n' pnarray+=$pn # Something wrong with this?
        echo "pnarray.len[${#pnarray[@]}]" # is always 1
    done
done

這不是一個完整的腳本,所以我希望這是清楚的。帶有“這看起來不錯”註釋的行列印出了我想要的內容。在我的範例資料中,我在「nspnarray」賦值中呼叫的命令列產生五行輸出,「nspnarray.len」列印語句顯示「5」。

然後,我遍歷這五個條目中的每一個,列印每一個。這看起來還是不錯的。正如預期的那樣,它列印了一個包含空格的值。然後我嘗試將其分配給我的“摘要”數組,然後列印摘要數組的長度,它始終列印“1”。我認為我在「這有什麼問題嗎?」的作業中做錯了什麼?線。

答案1

將一個數組添加到另一個數組非常簡單:

$ a=(1 2 3)
$ b=(4 5 6)
$ a+=("${b[@]}")
$ typeset -p a
declare -a a=([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="6")

但是,如果您正在使用陣列執行相對複雜的操作,那麼您確實應該使用更適合該任務的語言。 awk或者perl,例如。或者python。或除了 bash 或其他 shell 之外的幾乎任何東西。

shell 非常適合編排其他程式的執行(以及其他程式的管道,以及 stdin 和 stdout 的重定向等)來執行操作或處理資料。它本身並不擅長完成這些其他任務——事實上,它很糟糕。

awk具有多維數組(索引和關聯),perl也具有資料結構,其中數組或哈希可以包含其他數組和/或哈希,嵌套任意深度。大多數其他語言也具有複雜的資料結構。

而且,同樣重要的是,它們不存在 shell 所存在的引用或分詞問題。

相關內容