Arrays 使用';shuf';删除数组元素的步骤

Arrays 使用';shuf';删除数组元素的步骤,arrays,bash,shuffle,Arrays,Bash,Shuffle,几个月来我一直在自学bash,我对删除变量中元素的行为感到困惑 下面是一个测试: array=( "one" "two" "three" "four" ); unset array[`shuf -i 0-4 -n1`]; echo ${#array[@]} 我的问题是,如果我重复该测试,通常会产生3(数组中的元素数),但是重复几次(通常少于20次)完全相同的事情,就会产生4。 更新:当这种情况发生时,它实际上不会删除任何内容 如果我使用: v=${array[`shuf -i 0-4 -n1

几个月来我一直在自学bash,我对删除变量中元素的行为感到困惑

下面是一个测试:

array=( "one" "two" "three" "four" );
unset array[`shuf -i 0-4 -n1`]; 
echo ${#array[@]}
我的问题是,如果我重复该测试,通常会产生
3
(数组中的元素数),但是重复几次(通常少于20次)完全相同的事情,就会产生
4
。 更新:当这种情况发生时,它实际上不会删除任何内容

如果我使用:

v=${array[`shuf -i 0-4 -n1`]}
echo $v
array=( ${array[@]/$v/} )
echo ${#array[@]}
我也有同样的问题。有时数组完全消失,而
${#array[@]}
返回
3
并且元素所在的位置没有任何内容。但是,它很少返回
4
,且值为空。test
echo$v
有时返回一个空值,通常按照预期工作并返回一个数字。这就是问题所在,但我不知道为什么会发生,但很明显,这就是为什么元素的#没有改变

我知道问题出在
shuf
上。如果我只是:

unset数组[2]#指定,而不是使用'shuf'随机化

元素总是消失,元素的数量总是减少。 此外,关于
shuf
的问题通常涉及它的用法

有人熟悉这个吗?我是误解了用法还是这是一个bug?有没有线索说明为什么特别是
shuf
会导致这个问题

据我所知,
shuf
可靠地返回了一个有效的数字,因此理论上它总是返回一个要删除的有效数字,它确实返回了。不过,之后的行为是随机的,我还没有弄明白为什么只有在使用
shuf
生成要去的数组时才有意义。所以,当我把它传递到一个变量中时,似乎不知何故我得到了一个无法识别的字符或其他东西,它可能是空的

为了测试,我最后做了一个:

while [ true ]; do v=`shuf -i 0-4 -n1`; echo $v; done

有一段时间,我得到了一个有效的数字。因此,当我将其传递给变量时,似乎不知何故得到了一个无法识别的字符或其他东西。

在您的示例中有四个数组元素

array=( "one" "two" "three" "four" );
declare -p array
输出:

declare -a array='([0]="one" [1]="two" [2]="three" [3]="four")'
你的
shuf-i0-4-n1
产生5个不同的数字(0,1,2,3,4)

使用


啊!谢谢你的帮助,你抢先回答了我的问题。 我在上面睡了一觉,我(现在)终于明白了我的错误

看,我正在用bash编写一个简单的纸牌游戏(不要问细节,随我去),但忘了说明0-indexer${deck[51]}。当我凭直觉洗牌1-52。。。问题就在这里

或者就像我在上面的例子中所做的那样(你们都指出了;),我的数组是4个元素,我在搜索5个元素

添加:

exec 2>/tmp/45s.log
执行器1>&2
设置-x


在我的脚本开始时,我终于注意到了我的错误。谢谢大家的帮助。我认为离开一段时间会对我有所帮助。

我已经在不止一台机器上尝试过这种方法,包括我在工作中撞到的一台机器。这似乎不是硬件问题。您最好使用引号:
unset'array[$RANDOM%4]'
,否则您的命令将进行路径名扩展。(是的,这些是单引号)。@gniourf_gniourf:谢谢你的提示。
unset array[`shuf -i 0-3 -n1`]
unset array[$RANDOM%4]