2015-06-21 34 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