Como eu criaria essa função para escolher uma variável aleatória de uma matriz?

1

Aqui está minha tentativa:

rand_var() {
printf "%s\n" "${${!1}[RANDOM % ${#${!1}[@]}]}"
}

E eu corro assim

array=("something" "somethingelse" "test")
rand_var array

No entanto, ele me diz bad substitution . Eu acho que pode ter algo a ver com as variáveis e citando, mas eu não consigo descobrir, eu uso ${!1} para que ele realmente usa o conteúdo da variável e não apenas array . Esta linha funcionou antes quando eu especifico o nome da variável em vez de ${!1} .

    
por DisplayName 08.01.2016 / 02:25

1 resposta

2

Você pode fazer o que quiser copiando a matriz em uma variável local e, em seguida, selecionando a partir dessa matriz:

rand_var() {
    local nm="$1[@]"
    local tmp=("${!nm}")
    printf "%s\n" "${tmp[RANDOM % ${#tmp[@]}]}"
}

Eu não acho que você pode fazer isso de outra forma, porque você não pode indireto para o comprimento da matriz. Se você passou no tamanho da função também:

rand_var_len() {
    local nm="$1[$((RANDOM % $2))]"
    printf "%s\n" "${!nm}"
}
rand_var_len array ${#array[@]}

você pode fazer isso sem copiar.

Para evitar ambos, você precisará usar um dos eval -alikes.

    
por 08.01.2016 / 03:16

Tags