假设我的Python脚本输出以下行号:如何将由程序输出的空格分隔的数字放入Bash shell脚本的数组中?
python3 myscript -> 12 93 12 83
现在,我想打破这条线输出12 93 12 83
的成一个阵列,这样我就可以用(一些)执行命令这些作为论据。
如果有更简单的方法来实现这一点,请告诉我。否则,我如何将空格分隔的输出分解成数组?
假设我的Python脚本输出以下行号:如何将由程序输出的空格分隔的数字放入Bash shell脚本的数组中?
python3 myscript -> 12 93 12 83
现在,我想打破这条线输出12 93 12 83
的成一个阵列,这样我就可以用(一些)执行命令这些作为论据。
如果有更简单的方法来实现这一点,请告诉我。否则,我如何将空格分隔的输出分解成数组?
使用$()
捕捉命令的输出和直接到一个数组:
IFS=" "
set -f
my_array=($(python myscript))
# Do stuff with array
some_command "${my_array[@]}"
set +f
这样做什么设置隔板到空格字符,并最终通配符断,然后采取的myscript
输出和发送它的数组,以后可以用它来作为参数传递另一个命令
使用read
,它可以做的分裂,以创建数组:
IFS=" " read -r -a array < <(python3 myscript)
显然,上面假定空格用于分隔数字。
如果你想拆就空格和换行,如建议通过CharlesDuffy:
IFS=$' \n' read -r -d '' -a array < <(python3 myscript && printf '\0')
的-d ''
导致null字节被视为一个记录分隔符。
然后,您可以用"${array[@]}"
(双引号对于避免分词)很重要。 [@]
的意思是“所有阵列元素”,类似于"[email protected]"
意思是“所有位置参数”。要提取单个元素,可以使用"${array[1]}"
,"${array[2]}"
(其中索引通常是一个变量)。
您可以轻松地遍历数组元素:
for element in "${array[@]}"
do
echo "$element"
done
如果你想有一个循环,处理空数组,许多猛砸版本将使用上述扩张失败;那么你可以使用下面的语法:
for element in ${array[@]+"${array[@]}"}
do
echo "$element"
done
您可以"${#array[@]}"
检索数组中的项目数。
为什么你需要一个数组?假设你想使用第二和第四个条目。你可以简单地使用定位参数,并做到:
set -- $(python3 myscript) # Set positional parameters
some_cmd $2 $4
或者,你可以用命名值:
python3 myscript | { read col1 col2 col3 col4
some_cmd $col2 $col4
}
当然,如果我们假设理智的IFS值并且输出只能是数字,那么您可以在这里摆脱一堆快捷方式,但假设一个答案将被OP以外的人使用是合理的,而且该任择议定书将重用他们在其他问题的担保可能不成立的情况下在此学到的做法。 –
是的,这些解决方案假定myscript输出的特定格式,以及IFS的理智值。读者要小心,读者将被告知,读者可以从任何可能出现的错误中学习如果这些条件没有得到满足。 –
我可能只需要其中的一些。 – Shuzheng
@Shuzheng查看更新回答 – Jerfov2
另外,请注意,全部大写变量名称是为具有OS或shell含义的名称指定的,而小写变量是为应用程序使用而保留的;请参阅http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html。 –