如果我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