몇 개의 문자열이 있는데 그 중 하나에 무작위로 변수를 설정하고 싶습니다. 문자열이 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}
실제 변수 test001
등에 대한 한 수준의 간접 참조를 수행합니다.
변수 이름이 무엇이든 될 수 있는 경우(예: test001 somevar anothervar) 배열을 설정합니다.
declare -a teststrings=(test001 somevar anothervar)
v=${teststrings[$(($RANDOM % ${#teststrings[*]}))]}
w=${!v}
echo $w