ZSH의 무작위 배열 요소에 액세스

ZSH의 무작위 배열 요소에 액세스

저는 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))riarr

이제 에서 까지의 난수로 구문 분석합니다 $RANDOM % N. 이 경우 배열의 길이(요소의 개수)이지만, 배열 인덱스는 in에서 시작하므로 to의 값을 반환하기 위해서는 반드시 ()를 추가해야 합니다.0N-1N${#arr[@]}1zsh+ 1$(( $RANDOM % ${#arr[@]} + 1 ))1N

예를 들어 배열의 임의 요소를 인쇄하는 경우:

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) )

임의의 배열을 뒤섞기 위한 한 가지 기술은 계속해서 oeor o+glob 한정자를 사용하는 것입니다. 예를 들면 다음과 같습니다.

shuffled_array=( /(e['reply=("$array[@]")']no+shuffle) )

즉, e한정자를 사용하여 확장(여기에 적용됨 /) 을 설정하여 glob을 구성한 $reply다음 를 사용하여 정렬합니다 o+.

관련 정보