2017-04-22 86 views

回答

2

使用$()捕捉命令的输出和直接到一个数组:

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

这样做什么设置隔板到空格字符,并最终通配符断,然后采取的myscript输出和发送它的数组,以后可以用它来作为参数传递另一个命令

+0

我可能只需要其中的一些。 – Shuzheng

+0

@Shuzheng查看更新回答 – Jerfov2

+0

另外,请注意,全部大写变量名称是为具有OS或shell含义的名称指定的,而小写变量是为应用程序使用而保留的;请参阅http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html。 –

4

使用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[@]}"检索数组中的项目数。

+0

你能提供一个如何索引数组元素的小例子吗? @是指什么?我也可以使用read来拆分换行符吗? – Shuzheng

+0

@Fred,在给出明确的索引请求的情况下,您可能还会讨论''$ {array [0]}“,'”$ {array [1]}“等。 –

+0

@Shuzheng:如果您想要溢出在换行符中,我建议使用bash的'mapfile':'mapfile -t array <<(python3 myscript); declare -p array' – Cyrus

1

为什么你需要一个数组?假设你想使用第二和第四个条目。你可以简单地使用定位参数,并做到:

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

或者,你可以用命名值:

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

当然,如果我们假设理智的IFS值并且输出只能是数字,那么您可以在这里摆脱一堆快捷方式,但假设一个答案将被OP以外的人使用是合理的,而且该任择议定书将重用他们在其他问题的担保可能不成立的情况下在此学到的做法。 –

+0

是的,这些解决方案假定myscript输出的特定格式,以及IFS的理智值。读者要小心,读者将被告知,读者可以从任何可能出现的错误中学习如果这些条件没有得到满足。 –

相关问题