여러 개의 문자열이 있고 그 중 하나에 변수를 무작위로 설정하고 싶습니다. 문자열이 test001
, 및 test002
이라고 가정합니다 .test003
test004
정상적으로 설정했다면 분명히 다음과 같이 할 것입니다.
test=test001
하지만 나는 내가 가지고 있는 문자열 중에서 무작위로 하나를 선택하기를 원합니다. 나는 이와 같은 일을 할 수 있다는 것을 알고 있으며 이전에도 해본 적이 있지만 그것은 디렉토리에서 임의의 파일을 선택할 때였습니다.
test="$(printf "%s\n" "${teststrings[RANDOM % ${#teststrings[@]}]}")"
하지만 이 경우에는 어떻게 설정해야 할지 모르겠습니다 testrings
.
답변1
문자열을 배열에 저장합니다.
사용jot(1)
배열 인덱스를 무작위로 선택합니다.
해당 임의의 인덱스에 배열 요소를 인쇄합니다.
다음 스크립트를 고려해보세요 foo.sh
.
# initialize array a with a few strings
a=("test1" "test2" "test3" "test4" "test5" "test6")
# get the highest index of a (the number of elements minus one)
Na=$((${#a[@]}-1))
# choose:
# jot -r 1 1 entry, chosen at random from between
# 0 0 and ...
# $Na ... the highest index of a (inclusive)
randomnum=$(jot -r 1 0 $Na)
# index the array based on randomnum:
randomchoice="${a[$randomnum]}"
# display the result:
printf "randomnum is %d\na[randomnum] is '%s'\n" \
$randomnum "$randomchoice"
산출:
$ . foo.sh
randomnum is 3
a[randomnum] is 'test4'
$ . foo.sh
randomnum is 0
a[randomnum] is 'test1'
$ . foo.sh
randomnum is 4
a[randomnum] is 'test5'
$ . foo.sh
randomnum is 1
a[randomnum] is 'test2'
답변2
array=(test001 test002 test003 test004) ;
rand_var="${array[RANDOM%${#array[@]}]}";
답변3
다음과 같은 작업을 계속할 수 있습니다.
v=$(printf "test%03d" $(($RANDOM%4+1)))
v=${!v}
그 중 bash는 ${!variable}
실제 변수 등에 대한 1차 간접 주소 지정을 수행합니다 test001
.
변수 이름이 test001 somevar anothervar와 같이 무엇이든 될 수 있는 경우 배열을 설정합니다.
declare -a teststrings=(test001 somevar anothervar)
v=${teststrings[$(($RANDOM % ${#teststrings[*]}))]}
w=${!v}
echo $w