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はイメージビューアです。その部分は無視してください。 2番目の部分だけが必要です。

デフォルトでは、任意の配列要素にアクセスするには、次のものが必要です。つまり${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) )

任意の配列を混在させるための1つの技術は、引き続きoeor o+glob修飾子を使用することです。たとえば、次のようになります。

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

つまり、e修飾子を使用して拡張(ここに適用されます/)を設定してglobを設定し、$replyそれを使用してソートしますo+

関連情報