如何随机化列表并遍历随机列表(bash)

时间:2011-10-12 15:05:18

标签: bash ubuntu ubuntu-10.04

我写了一个小的bash脚本,它在文本文件中读取命令(每行一个)。 目前,脚本(如下所示)按顺序执行命令(即以与文件中输入的顺序相同的顺序)。

我想帮助修改下面的脚本,以便它将命令读入数组,然后在迭代通过随机列表之前随机化该数组(即列表)。

这是我到目前为止所做的:

while read -r -a array
do
   python make_move.py "${array[@]}"
done < game_commands.dat

我在Ubuntu 10.0.4 LTS上运行bash 4.1.5

[[编辑]]

我需要执行列表中的所有命令,每个命令只执行一次。

3 个答案:

答案 0 :(得分:4)

您可以使用shuf命令对文件行进行随机播放。

修改:使用shuf的代码看起来像

while read -r -a array
do
    python make_move.py "${array[@]}"
done < <(shuf game_commands.dat)

答案 1 :(得分:1)

试试sort -R。这将随机改变线条。 编辑:但是相同的行总是出现在块中......

答案 2 :(得分:1)

如果您需要在 shuf 不可用的系统上执行此类操作, ( bash 4 ,很容易适应大多数现代贝壳):

unset max s i
readarray -t _cmd < game_commands.dat
while (( max < ${#_cmd[@]} )); do
  (( i = RANDOM % ${#_cmd[@]} ))
  [[ $s == *,$i,*  ]] || {
     python make_move.py "${_cmd[i]}"
         (( max++ ))
        }
  s+=,$i,
done