2017-04-22 65 views

回答

2

使用$()捕捉命令的輸出和直接到一個數組:

IFS=" " 
set -f 
my_array=($(python myscript)) 
# Do stuff with array 
some_command "${my_array[@]}" 
set +f 

這樣做什麼設置隔板到空格字符,並最終通配符斷,然後採取的myscript輸出和發送它的數組,以後可以用它來作爲參數傳遞另一個命令

+0

我可能只需要其中的一些。 – Shuzheng

+0

@Shuzheng查看更新回答 – Jerfov2

+0

另外,請注意,全部大寫變量名稱是爲具有OS或shell含義的名稱指定的,而小寫變量是爲應用程序使用而保留的;請參閱http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html。 –

4

使用read,它可以做的分裂,以創建數組:

IFS=" " read -r -a array < <(python3 myscript) 

顯然,上面假定空格用於分隔數字。

如果你想拆就空格和換行,如建議通過CharlesDuffy:

IFS=$' \n' read -r -d '' -a array < <(python3 myscript && printf '\0') 

-d ''導致null字節被視爲一個記錄分隔符。

然後,您可以用"${array[@]}"(雙引號對於避免分詞)很重要。 [@]的意思是「所有陣列元素」,類似於"[email protected]"意思是「所有位置參數」。要提取單個元素,可以使用"${array[1]}","${array[2]}"(其中索引通常是一個變量)。

您可以輕鬆地遍歷數組元素:

for element in "${array[@]}" 
do 
    echo "$element" 
done 

如果你想有一個循環,處理空數組,許多猛砸版本將使用上述擴張失敗;那麼你可以使用下面的語法:

for element in ${array[@]+"${array[@]}"} 
do 
    echo "$element" 
done 

您可以"${#array[@]}"檢索數組中的項目數。

+0

你能提供一個如何索引數組元素的小例子嗎? @是指什麼?我也可以使用read來拆分換行符嗎? – Shuzheng

+0

@Fred,在給出明確的索引請求的情況下,您可能還會討論''$ {array [0]}「,'」$ {array [1]}「等。 –

+0

@Shuzheng:如果您想要溢出在換行符中,我建議使用bash的'mapfile':'mapfile -t array <<(python3 myscript); declare -p array' – Cyrus

1

爲什麼你需要一個數組?假設你想使用第二和第四個條目。你可以簡單地使用定位參數,並做到:

set -- $(python3 myscript) # Set positional parameters 
some_cmd $2 $4 

或者,你可以用命名值:

python3 myscript | { read col1 col2 col3 col4 
some_cmd $col2 $col4 
} 
+0

當然,如果我們假設理智的IFS值並且輸出只能是數字,那麼您可以在這裏擺脫一堆快捷方式,但假設一個答案將被OP以外的人使用是合理的,而且該任擇議定書將重用他們在其他問題的擔保可能不成立的情況下在此學到的做法。 –

+0

是的,這些解決方案假定myscript輸出的特定格式,以及IFS的理智值。讀者要小心,讀者將被告知,讀者可以從任何可能出現的錯誤中學習如果這些條件沒有得到滿足。 –

相關問題