2015-06-21 4 views
0

У меня есть функция, которая выбирает случайный объект из массива. Я завернул внутреннюю Баш функцию RANDOM и реализовал свою функцию так:bash - выбор случайного объекта из массива

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

Это прекрасно работает, но я хотел бы узнать способ ее реализации без промежуточного массива OBJS , Есть идеи? Заранее спасибо

+0

'shift $ (($ (rand 1 $ #) - 1)); echo "$ 1" '? –

+0

@EtanReisner, почему бы вам не ответить на него? – volcano

ответ

2

ли что-то вроде этого

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

делать то, что вы хотите?

Вышеупомянутые проблемы с аргументами, которые end с символами перевода строки.

Командная замена всегда удаляет завершающие символы новой строки.

Чтобы справиться с этим сценарием, вам нужно будет придерживаться фиктивного символа/etc. в конце и удалите его во время использования. Что-то вроде этого:

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

Спасибо, это хороший – volcano

2

Есть слишком много способов. здесь почти Oneliner, но предположим, что вы не место в ваших строк, и вы никогда не трогали СИФ:

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

Спасибо, очень приятно - я никогда не встречал _shuf_. Но я ищу что-то, что не требует слишком большого количества вызовов. – volcano

+2

Чтобы ухаживать за пространствами, и предположив, что в аргументах нет новых строк, измените 'echo $ {ARRAY [@]} | tr '' '\ n'' to 'printf"% s \ n "" $ {ARRAY [@]} "' – anishsane

Смежные вопросы