混淆使用' shuf'删除数组元素

时间:2015-01-11 07:50:05

标签: 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`]}
echo $v
array=( ${array[@]/$v/} )
echo ${#array[@]}

我得到完全相同的问题。有时数组完全消失了,${#array[@]}返回3,元素没有。但很少会返回4并且值为空。测试echo $v有时会返回一个空值,通常它按预期工作并返回一个数字。这就是问题所在,但我无法弄清楚它为什么会发生,但很明显为什么元素的数量没有变化。

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

unset array[2] #specify, instead of using 'shuf' to randomize

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

有人熟悉这个吗?我误解了一个用法还是这个bug?任何线索,特别是shuf会导致这个问题吗?

据我所知,shuf可靠地返回一个有效数字,所以理论上它总是返回一个有效的数字来删除,它确实如此。之后的行为是随机的,我还没弄清楚为什么只有当我使用shuf来生成数组时才会这么做。因此,当我将它传递给变量时,似乎我以某种方式获得了一个无法识别的字符或其他东西,它可能是null。

为了测试,我终于,我做了一个:

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

有一段时间,我得到一个有效的号码。因此,当我将它传递给变量时,似乎我以某种方式获得了一个无法识别的字符或其他东西。

2 个答案:

答案 0 :(得分:2)

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

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

输出:

declare -a array='([0]="one" [1]="two" [2]="three" [3]="four")'

您的shuf -i 0-4 -n1生成五个不同的数字(0,1,2,3,4)。

使用

unset array[`shuf -i 0-3 -n1`]

unset array[$RANDOM%4]

答案 1 :(得分:0)

唉唉!谢谢你的帮助,你打败了我自己的答案。 我睡着了,我的漂亮(现在)清晰的错误终于明白了。

看,我正在用bash写一个简单的纸牌游戏(不要问细节跟我一起去),忘了考虑0-indexer $ {deck [51]}。当我直观地洗牌1-52时......问题出在那里。

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

添加: exec 2> /tmp/45s.log exec 1>&2 set -x

在我的脚本开头帮助我终于发现了我的错误。谢谢大家的帮助。我走开一段时间的情况会帮助我。