2015-06-21 33 views
0

我有一个函数可以从数组中选择一个随机对象。我已经包裹内庆典功能随机,并实现我的功能类似:bash - 从数组中选择随机对象

function rand() { echo $[ $RANDOM % $2 + $1 ]; } 
function rand_obj() { objs=([email protected]); index=$(rand 0 $#); echo ${objs[$index]} ; } 

它工作得很好,但我很想学习贯彻它没有中间阵列的方式OBJ文件 。有任何想法吗? 在此先感谢

+0

'shift $(($(rand 1 $#) - 1));回声“$ 1”'? –

+0

@EtanReisner,你为什么不把它当作答案? – volcano

回答

2

难道这样的事情

rand_obj() { 
    shift $(($(rand 1 $#) - 1)); echo "$1" 
} 

你想要什么?

上面具有参数的问题,用换行。

命令替换始终删除尾随的换行符。

,以处理情况你需要坚持一个哑字符/等。最后在使用时删除它。像这样:

rand_obj() { 
    shift $(($(rand 1 $#) - 1)); echo "$1x" 
} 
elem=$(rand_obj ... ... ... ... ...) 
elem=${elem%x} 
+0

谢谢,这是一个很好的例子 – volcano

2

有太多的方法。这里几乎是oneliner,但假设你在你的字符串有没有空间,你从未接触过IFS:

echo ${ARRAY[@]} | tr ' ' '\n' | shuf -n1 
+0

谢谢,非常好 - 我从未遇到_shuf_。但是我正在寻找一些不涉及太多调用的东西 – volcano

+2

要照顾空间,并假定参数中没有换行符,请更改'echo $ {ARRAY [@]} | tr'''\ n''到'printf'%s \ n“”$ {ARRAY [@]}“' – anishsane