몇 가지 문자열 중에서 임의의 문자열을 선택하여 변수로 설정하시겠습니까?

몇 가지 문자열 중에서 임의의 문자열을 선택하여 변수로 설정하시겠습니까?

몇 개의 문자열이 있는데 그 중 하나에 무작위로 변수를 설정하고 싶습니다. 문자열이 test001, test002test003이라고 가정합니다 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

관련 정보