假设我的Python脚本输出以下数字:
python3 myscript -> 12 93 12 83
现在,我想将这一行输出12 93 12 83
分解为一个数组,这样我就可以用(某些)这些作为参数执行命令。
如果有更简单的方法可以实现这一点,请告诉我。否则,如何将空格分离的输出分解为数组?
答案 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
}