Convert a Python Data list to a bash array
我有一个bash脚本,它像这样调用一个python脚本:
1 | OUTPUT=$(python /path/path/script.py attr attr attr); |
python脚本将返回这样的数据列表:
1 | [item1, item2, item3] |
如何将作为返回python数据列表字符串的$ouput变量转换为bash数组?
如果可能的话,我想阅读bash中的每一项。
加上
1 2 3 4 5 6 | OUTPUT=($(python /path/path/script.py attr attr attr | tr -d '[],')) echo ${OUTPUT[0]} echo ${OUTPUT[1]} echo ${OUTPUT[2]} echo ${OUTPUT[@]} |
输出:
1 2 3 4 | item1 item2 item3 item1 item2 item3 |
您可以让script.py打印一个用空格分隔每个项的字符串,bash将转换为数组,或者使用bash将python脚本的返回值转换为您想要的格式。
如果选择从script.py打印字符串,则可以使用以下python代码:
1 2 3 4 5 | returnList = [1, 2, 3] returnStr = '' for item in returnList: returnStr += str(item)+' ' print(returnStr) |
在这种情况下,以下bash脚本的输出:
1 2 3 4 5 6 | OUTPUT=$(python /path/to/script.py) echo $OUTPUT for i in $OUTPUT; do echo $i done |
是:
1 2 3 4 | 1 2 3 1 2 3 |
希望这对你有帮助。
我将使用一个简短的python包装器将字符串转换为更易于由
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 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" ".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 |
在
1 | readarray -t OUTPUT < <(python -c ... ) |
bash声明的数组如下:
1 | foo=(bar baz ban) |
要将空间分隔的命令输出转换为数组,可以执行以下操作:
1 | foo=($(my_command)) |
在python中,将列表转换为以空格分隔的字符串非常容易:
1 | ' '.join(my_array) |
如果您使用ecx1(2),而不是列表本身,那么您可以将其转换为一个数组。
如果您只想从python中的python列表创建一个bash列表,那么可以使用以下一行程序:
1 | python -c 'print("".join([str(elem) for elem in [1,"l", 12]]))' |
它直接为您提供了列表:
1 | 1 l 12 |
注意,它需要修改python代码,而不是从外部bash代码进行修改。