将Python数据列表转换为bash数组

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中的每一项。


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

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包装器将字符串转换为更易于由bash解析的内容。

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

bash4中,可以使用readarray命令替换while循环:

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代码进行修改。