首页 > 解决方案 > 在 shell 脚本中生成随机字符

问题描述

我现有的脚本可以产生 "blue,blue,red,red"但不希望重复任何颜色。

#!/bin/sh

c1="white"
c2='yellow'
c3='orange'
c4='red'
c5='green'
c6='blue'

array=( "$c1" "$c2" "$c3" "$c4" "$c5" "$c6"  )

rand0=$RANDOM
rand0=$[ $rand0 % 6 ]

rand1=$RANDOM
rand1=$[ $rand1 % 6 ]

rand2=$RANDOM
rand2=$[ $rand2 % 6 ]

rand3=$RANDOM
rand3=$[ $rand3 % 6 ]

r0=${array[$rand0]}
r1=${array[$rand1]}
r2=${array[$rand2]}
r3=${array[$rand3]}

mastermind=( "$r0" "$r1" "$r2" "$r3" )

如何过滤重复项并重新滚动以避免重复项?

标签: shell

解决方案


一种方法是删除已从“数组”中选择的项目,并检查新选择是否未引用已删除的项目。它试图将 OP 代码的行为概括为 - 它循环请求项目的数量 (4),并且它允许输入中的任意数量的项目array,而无需修改代码。

#! /bin/bash

array=( white yellow orange red green blue )
mastermind=()
  # Count entries in array
N=${#array[@]}
for i in {0..3} ; do

   # Find R, where array[R] is valid
   while R=$((RANDOM%N)) ; do [ "${array[R]}" ] && break ; done

   # Add to result
   mastermind+=( ${array[R]} )

   # Mark item R as invalid
   unset 'array[R]'
done
echo "${mastermind[@]}"

推荐阅读