저는 ZSH를 메인 셸로 사용하고 있으며 무작위로 배열에 액세스하려고 합니다. 사람들이 계속 전화하는 것을 보는데 feh
주문이 없습니다. 나도 가지고 있는데 _feh
같은 것인지, 명령이 무엇인지는 모르겠습니다.
참조는 다음과 같습니다.
FILES=( .../files/* )
feh $FILES[$RANDOM%$#FILES+1]
내 테스트는 다음과 같습니다.
test=(a b c); feh ${test[$RANDOM]}
참고로 OSX 10.10.x를 사용하고 있습니다. 결국 나는 이것을 내가 소유한 일부 호스트에 대한 SSH 액세스를 무작위로 지정하는 데 사용할 것입니다.
답변1
feh
는 이미지 뷰어입니다. 해당 부분은 무시하세요. 두 번째 부분만 필요합니다.
기본적으로 임의의 배열 요소에 액세스하려면 다음과 같은 것이 필요합니다. 즉 ${arr[${ri}]}
, 배열의 임의 인덱스가 되어야 합니다.ri
$(( $RANDOM % ${#arr[@]} + 1))
ri
arr
이제 에서 까지의 난수로 구문 분석합니다 $RANDOM % N
. 이 경우 배열의 길이(요소의 개수)이지만, 배열 인덱스는 in에서 시작하므로 to의 값을 반환하기 위해서는 반드시 ()를 추가해야 합니다.0
N-1
N
${#arr[@]}
1
zsh
+ 1
$(( $RANDOM % ${#arr[@]} + 1 ))
1
N
예를 들어 배열의 임의 요소를 인쇄하는 경우:
print -r -- ${arr[$(( $RANDOM % ${#arr[@]} + 1 ))]}
또는 간단히 말해서 배열 인덱스는 산술 표현식으로 구문 분석됩니다.
print -r -- "$arr[RANDOM % $#arr + 1]"
csh 스타일 구문을 사용하는 경우(확장을 중괄호로 묶지 않은 경우) 아래 첨자를 구문 분석하기 위해 따옴표가 필요합니다 . 또는 또는 (ksh 스타일) zsh
로 작성할 수 있습니다 .$arr[RANDOM%$#arr+1]
${arr[RANDOM % $#arr + 1]}
답변2
또 다른 방법은 배열을 섞는 것입니다. 여기서 전역 확장으로 인한 배열의 경우 다음과 같은 방법으로 수행할 수 있습니다.
files=( .../files/*(noe['REPLY=$RANDOM']) )
feh $files # or $files[1]
또는
shuffle() REPLY=$RANDOME
files=( .../files/*(no+suffle) )
임의의 배열을 뒤섞기 위한 한 가지 기술은 계속해서 oe
or o+
glob 한정자를 사용하는 것입니다. 예를 들면 다음과 같습니다.
shuffled_array=( /(e['reply=("$array[@]")']no+shuffle) )
즉, e
한정자를 사용하여 확장(여기에 적용됨 /
) 을 설정하여 glob을 구성한 $reply
다음 를 사용하여 정렬합니다 o+
.