내 시도는 다음과 같습니다.
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
.