如何将程序输出的数字(由空格分隔)放入Bash shell脚本中的数组中?

时间:2017-04-22 15:45:31

标签: python linux bash shell

假设我的Python脚本输出以下数字:

python3 myscript -> 12 93 12 83

现在,我想将这一行输出12 93 12 83分解为一个数组,这样我就可以用(某些)这些作为参数执行命令。

如果有更简单的方法可以实现这一点,请告诉我。否则,如何将空格分离的输出分解为数组?

3 个答案:

答案 0 :(得分:4)

使用read,可以进行拆分以创建数组:

IFS=" " read -r -a array < <(python3 myscript)

显然,上面假设使用空格来分隔数字。

如果你想按照CharlesDuffy的建议拆分空格和换行符:

IFS=$' \n' read -r -d '' -a array < <(python3 myscript && printf '\0')

-d ''导致空字节被视为记录分隔符。

然后,您可以使用"${array[@]}"扩展数组(双引号对于避免单词拆分非常重要)。 [@]表示“所有数组元素”,类似于"$@"表示“所有位置参数”的方式。要提取单个元素,您可以使用"${array[1]}""${array[2]}"(索引通常是变量)。

您可以轻松地遍历数组元素:

for element in "${array[@]}"
do
    echo "$element"
done

如果你想要一个处理空数组的循环,许多Bash版本将使用上面的扩展失败;然后,您可以使用以下语法:

for element in ${array[@]+"${array[@]}"}
do
    echo "$element"
done

您可以使用"${#array[@]}"检索数组中的项目数。

答案 1 :(得分:2)

使用$()捕获命令的输出并指向数组:

IFS=" "
set -f
my_array=($(python myscript))
# Do stuff with array
some_command "${my_array[@]}"
set +f

这样做是将分隔符设置为空格字符,然后关闭globbing,然后获取myscript的输出并将其发送到数组,稍后您可以使用它作为另一个命令的参数传递< / p>

答案 2 :(得分:1)

为什么需要阵列?假设您要使用第2和第4个条目。您可以简单地使用位置参数并执行:

set -- $(python3 myscript)  # Set positional parameters
some_cmd $2 $4

或者,您可以使用以下命名来命名值:

python3 myscript | { read col1 col2 col3 col4
some_cmd $col2 $col4
}