如何循环 shuf 的输出?

ber*_*436 8 bash shell-script

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

但如果我这样做:

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

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

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

Jan*_*nis 11

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

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

或者让外壳分裂标量

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


gle*_*man 8

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

seq 10 | shuf | while read i; do echo $i; done
Run Code Online (Sandbox Code Playgroud)

这会在子 shell 中运行 while 循环,因此该i变量无法持续到当前 shell 中。你可以shopt -s lastpipe反驳,或者完全避免管道

while read i; do echo $i; done < <( shuf -e $(seq 10) )
Run Code Online (Sandbox Code Playgroud)