배열에서 임의의 변수를 선택하려면 이 함수를 어떻게 만듭니까?

배열에서 임의의 변수를 선택하려면 이 함수를 어떻게 만듭니까?

내 시도는 다음과 같습니다.

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

저는 이렇게 운영해요

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

그러나 그것은 나에게 말한다 bad substitution. 나는 이것이 변수 및 참조와 관련이 있다고 생각했지만 그것을 알아낼 수 없었습니다. 실제로 변수 이름을 지정하는 ${!1}것이 아니라 변수의 내용을 사용하도록 이 줄을 사용했습니다. .array${!1}

답변1

배열을 지역 변수에 복사한 다음 해당 배열에서 선택하여 원하는 작업을 수행할 수 있습니다.

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

배열의 길이를 간접적으로 모르기 때문에 이렇게 할 수는 없을 것 같습니다. 함수에 길이를 전달하는 경우:

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

그러면 복사하지 않고도 할 수 있습니다.

두 가지 상황을 모두 피하려면 둘 중 하나를 사용해야 합니다 eval.

관련 정보