
私は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))
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) )
任意の配列を混在させるための1つの技術は、引き続きoe
or o+
glob修飾子を使用することです。たとえば、次のようになります。
shuffled_array=( /(e['reply=("$array[@]")']no+shuffle) )
つまり、e
修飾子を使用して拡張(ここに適用されます/
)を設定してglobを設定し、$reply
それを使用してソートしますo+
。