2014-10-02 91 views
5

我有一個調用一個python腳本,像這樣一個bash腳本:轉換一個Python數據列表一個bash陣列

OUTPUT=$(python /path/path/script.py attr attr attr); 

的Python腳本將返回像這樣的數據列表:

[item1, item2, item3] 

如何將返回的python數據列表的字符串$ OUPUT變量轉換爲bash數組?

我想閱讀bash中的每個項目,如果可能的話。

+0

我能夠從python中檢索字符串,我想知道如何將該字符串轉換爲bash數組。 – dieheld 2014-10-02 14:01:34

+0

如果您可以修改python腳本來更改其輸出,這將使這更容易和更安全,以獲得更多可能的輸出值。否則,你不得不斷言有關輸出的內容。 – 2014-10-02 14:02:51

+0

這是我遇到的問題,我不允許改變輸出,這是一個尷尬的任務分配給我:( – dieheld 2014-10-02 14:11:35

回答

14

添加()| tr -d '[],'

OUTPUT=($(python /path/path/script.py attr attr attr | tr -d '[],')) 

echo ${OUTPUT[0]} 
echo ${OUTPUT[1]} 
echo ${OUTPUT[2]} 
echo ${OUTPUT[@]} 

輸出:

item1 
item2 
item3 
item1 item2 item3 
+0

天才,謝謝,這是一個體面的解決方案! – dieheld 2014-10-02 14:37:22

+2

+1。事情會如果數組元素包含空格,會變得更加複雜。 – 2014-10-02 14:56:03

+0

@glennjackman:是的,這個解決方案不適用於帶有空格的項目。 – Cyrus 2014-10-02 15:54:45

1

你可以讓你的script.py打印一個字符串,用空格分隔每個項目,Bash會將其轉換爲數組,或者你可以使用Bash將python腳本的返回值轉換爲你想要的格式。

如果選擇打印您script.py一個字符串,你可以使用下面的Python代碼:

returnList = [1, 2, 3] 
returnStr = '' 
for item in returnList: 
    returnStr += str(item)+' ' 
print(returnStr) 

在這種情況下,以下bash腳本的輸出:

OUTPUT=$(python /path/to/script.py) 
echo $OUTPUT 
for i in $OUTPUT; 
do 
    echo $i 
done 

是:

1 2 3 
1 
2 
3 

希望這可以幫助你。

1

擊聲明陣列是這樣的:

foo=(bar baz ban) 

要轉換空間分隔命令輸出到陣列可以因此這樣做:

foo=($(my_command)) 

而且轉換列表,以空格分隔字符串是很容易在Python:

' '.join(my_array) 

如果print,與其列表本身就可以因此平凡它轉換成數組。

2

我會用一個簡短的Python包裝器將字符串轉換爲bash以上的可解析的東西。

# Proxy for script.py output that includes some potential bash pitfalls 
python_output="['a b', 'c*', 6]" 

# Let Python output each element of the list as a separate line; 
# the only thing this cannot handle is multi-line elements; workarounds 
# are possible, but not worth getting into unless necessary. 
while read -r; do 
    OUTPUT+=("$REPLY") 
done < <(python -c 'import ast, sys 
print "\n".join(str(x) for x in ast.literal_eval(sys.argv[1])) 
' "$python_output") 

# Verify that each element was added to the array unscathed. 
for e in "${OUTPUT[@]}"; do 
    echo "$e" 
done 

bash 4,你可以使用readarray命令替換while循環:

readarray -t OUTPUT < <(python -c ...) 
0

如果你想簡單地創建從蟒蛇Python列表一個bash列表,您可以使用此一個班輪:

my_list = [1, "l", 12] 
" ".join([str(elem) for elem in my_list]) 

它給你:

'1 l 12'