ZSHマニュアル(zshparam(1)
)の内容は次のとおりです。
Array Subscripts
Individual elements of an array may be selected using a subscript. A
subscript of the form `[exp]' selects the single element exp, where
exp is an arithmetic expression which will be subject to arithmetic
expansion as if it were surrounded by `$((...))'.
しかし、これはすぐに失敗します。
mc% arr=(a b c d e)
mc% echo $arr[$#arr]
e
mc% echo $arr[$(($#arr))]
e
mc% echo $arr[$(($#arr - 1))]
d
mc% echo $arr[$#arr - 1]
zsh: invalid subscript
質問:なぜ?例外は何ですか?
メモ:この問題は、以下に由来します。don_crisstiさんの回答があります。、彼らは$arr[RANDOM % $#arr + 1]
ランダムな要素にアクセスすることを提案しますが、これは上記のエラーを引き起こします。
答え1
技術的には、すべての式は下付き文字で表示できます。問題は、パーサーが必要なものを下付き文字に入れるようにすることです。一部の文字(スペースを含む)は表示されません。下付き文字は単語の一部であるため、単語構成文字のみを下付き文字の一部にすることができます。
mc% echo $arr[ 1]
zsh: invalid subscript
mc% echo $arr[1 ]
zsh: invalid subscript
mc% echo $arr[$#arr - 1]
zsh: invalid subscript
mc% echo $arr[$#arr-1]
d
下付き文字パーサーは、最初の無効な文字で停止し、zshが終了するかっこを確認する前に、「無効な下付き文字」エラーが発生します。
mc% echo $arr[ 1
zsh: invalid subscript
のecho $arr[ 1]
空白の後ろの部分は実際には別の単語と見なされます。echo
拡張の結果である2つの引数を受け取りますが、解析は失敗するため、zshはコマンドの実行を開始しません。場合によっては、算術式の一部と思われる内容が実際には次のように解析されないことがわかります。たとえば、次のようになります。$arr[
1]
mc% echo $arr[1<<2]
heredoc> << is a heredoc operator, not part of the subscript.
heredoc> 2]
zsh: invalid subscript
もちろん、単語を形成しない文字は、算術式やコマンドの置換など、入れ子になった拡張の一部として密かに入ることができます。
mc% echo $arr[$[1&3]]
a
mc% echo $arr[`echo "1 + 2"`]
c
引数拡張に二重引用符を使用する場合、すべての文字(平衡括弧または閉じ引用符を除く)は下付き文字の一部になります。これは、二重引用符内のすべての文字が実際に単語を作成する文字であるためです。同様に、パラメータ拡張が中括弧を使用している場合、zshは}
下付き文字の閉じ括弧を見つける前にパラメータ拡張の閉じ括弧を探します。]
したがって、単語を構成しない文字は下付き文字に入ります。
mc% echo "$arr[$#arr - 1]"
d
mc% echo ${arr[$#arr - 1]}
d
具体的な内容を知りたい場合は、関連機能は次のとおりです。parse_subscript
、次から電話するgetindex
。