我一直在教自己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
有一段时间,我得到一个有效的号码。因此,当我将它传递给变量时,似乎我以某种方式获得了一个无法识别的字符或其他东西。
答案 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
在我的脚本开头帮助我终于发现了我的错误。谢谢大家的帮助。我走开一段时间的情况会帮助我。