【问题标题】:Convert a Python Data list to a bash array将 Python 数据列表转换为 bash 数组
【发布时间】:2014-10-02 13:54:40
【问题描述】:

我有一个 bash 脚本,它像这样调用 python 脚本:

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

python 脚本将返回一个数据列表,如下所示:

[item1, item2, item3]

如何将返回 python 数据列表的字符串 $OUPUT 变量转换为 bash 数组?

如果可能,我想阅读 bash 中的每个项目。

【问题讨论】:

  • 我能够从 python 中检索字符串,我想知道如何将该字符串转换为 bash 数组。
  • 如果您可以修改 python 脚本以更改其输出,这将使这更容易和更安全地获得更多可能的输出值。否则,您必须对输出中允许包含的内容做出断言。
  • 这是我遇到的问题,我不允许更改输出,分配给我的任务很尴尬:(

标签: arrays bash list


【解决方案1】:

添加()| 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

【讨论】:

  • +1。如果数组元素包含空格,事情会变得更加复杂。
  • @glennjackman:是的,这个解决方案不适合带有空格的项目。
  • 使用 bash >= 4.0 这适用于带有空格的项目:mapfile -t OUTPUT < <(python /path/path/script.py attr attr attr | sed 's/[][]//g;s/, /\n/g')
  • 显示script.py的内容会有助于确保清晰。
【解决方案2】:

你可以让你的 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

希望对你有所帮助。

【讨论】:

  • 这是我见过的最干净的解决方案之一。谢谢
【解决方案3】:

Bash 像这样声明数组:

foo=(bar baz ban)

要将空格分隔的命令输出转换为数组,您可以这样做:

foo=($(my_command))

在 Python 中将列表转换为空格分隔的字符串非常简单:

' '.join(my_array)

如果您print 表示您可以轻松地将其转换为数组,而不是列表本身。

【讨论】:

    【解决方案4】:

    我会使用一个简短的 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
    

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

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

    【讨论】:

      【解决方案5】:

      如果你想简单地从 python 中的 python 列表创建一个 bash 列表,你可以使用这个单行:

      python -c 'print(" ".join([str(elem) for elem in [1, "l", 12]]))'
      

      它直接给你列表:

      1 l 12
      

      请注意,它需要修改 python 代码,而不是从外部 bash 代码中执行此操作。

      【讨论】:

        猜你喜欢
        • 2021-03-22
        • 1970-01-01
        • 2019-01-23
        • 2012-06-13
        • 2011-09-23
        • 2019-10-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        相关资源
        最近更新 更多