假設我的Python腳本輸出以下行號:如何將由程序輸出的空格分隔的數字放入Bash shell腳本的數組中?
python3 myscript -> 12 93 12 83
現在,我想打破這條線輸出12 93 12 83
的成一個陣列,這樣我就可以用(一些)執行命令這些作爲論據。
如果有更簡單的方法來實現這一點,請告訴我。否則,我如何將空格分隔的輸出分解成數組?
假設我的Python腳本輸出以下行號:如何將由程序輸出的空格分隔的數字放入Bash shell腳本的數組中?
python3 myscript -> 12 93 12 83
現在,我想打破這條線輸出12 93 12 83
的成一個陣列,這樣我就可以用(一些)執行命令這些作爲論據。
如果有更簡單的方法來實現這一點,請告訴我。否則,我如何將空格分隔的輸出分解成數組?
使用$()
捕捉命令的輸出和直接到一個數組:
IFS=" "
set -f
my_array=($(python myscript))
# Do stuff with array
some_command "${my_array[@]}"
set +f
這樣做什麼設置隔板到空格字符,並最終通配符斷,然後採取的myscript
輸出和發送它的數組,以後可以用它來作爲參數傳遞另一個命令
使用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[@]}"
檢索數組中的項目數。
爲什麼你需要一個數組?假設你想使用第二和第四個條目。你可以簡單地使用定位參數,並做到:
set -- $(python3 myscript) # Set positional parameters
some_cmd $2 $4
或者,你可以用命名值:
python3 myscript | { read col1 col2 col3 col4
some_cmd $col2 $col4
}
當然,如果我們假設理智的IFS值並且輸出只能是數字,那麼您可以在這裏擺脫一堆快捷方式,但假設一個答案將被OP以外的人使用是合理的,而且該任擇議定書將重用他們在其他問題的擔保可能不成立的情況下在此學到的做法。 –
是的,這些解決方案假定myscript輸出的特定格式,以及IFS的理智值。讀者要小心,讀者將被告知,讀者可以從任何可能出現的錯誤中學習如果這些條件沒有得到滿足。 –
我可能只需要其中的一些。 – Shuzheng
@Shuzheng查看更新回答 – Jerfov2
另外,請注意,全部大寫變量名稱是爲具有OS或shell含義的名稱指定的,而小寫變量是爲應用程序使用而保留的;請參閱http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html。 –