如何循环 shuf 的输出?

如何循环 shuf 的输出?

如果我gshuf -e $(seq 1 10)在 bash 中这样做,它将以随机顺序打印数字 1 到 10。

但如果我这样做:

a=$(shuf -e $(seq 1 10))
for i in "${a[@]}"
do
    echo $i
    echo "next"
done

它打印所有十个数字,后跟“下一个”。

如何循环 shuf(或 os x 中的 gshuf)的输出?变量a似乎是一个字符串,所以我可以将其拆分。但这似乎有点马虎。如何让 shuf 输出数组?

答案1

您正在使用标量分配。要么使用数组

a=( $(shuf -e $(seq 1 10)) )
for i in "${a[@]}"
do
    echo $i
    echo "next"
done

或者让 shell 分割标量

a=$(shuf -e $(seq 1 10))
for i in ${a}
do
    echo $i
    echo "next"
done

答案2

您不需要将输出存储在变量中:

seq 10 | shuf | while read i; do echo $i; done

它在子 shell 中运行 while 循环,因此该i变量无法保留到当前 shell 中。您可以shopt -s lastpipe解决这个问题,或者完全避免管道

while read i; do echo $i; done < <( shuf -e $(seq 10) )

答案3

如果你想$a作为数组处理,你需要将其初始化为数组:

a=( $(shuf -e $(seq 1 10)) )

然后你的循环会产生预期的输出。

答案4

一条单行线...

shuf -e {1..10} | xargs -I%    echo % next

相关内容