${parameter:?word} 配列範囲の拡張

${parameter:?word} 配列範囲の拡張

${parameter:?word}変数が設定されていない場合は、指定されたエラーメッセージを出力します。

$ echo ${unset_var?badness}
bash: unset_var: badness

配列でどのように使用しますか?

$ array=(a b c)
$ echo "${array[@]:1:2}"
b c

そして:

$ echo "${array[@]:1:2?Need at least two arguments}"

bash文句を言う:

bash: array[@]: a: expression recursion level exceeded (error token is "a")

zsh文句を言う:

zsh: bad math expression: operator expected at `a least tw...'

これは位置パラメータに対しても異なる動作をします。

$ echo ${1?Argument not given}
bash: 1: Argument not given

たとえば、配列の範囲を印刷できます。

$ set a b c
$ echo ${@:2}
b c

または他のオプション:

$ echo ${@:2:$#-1}
b c

bash:

$ set a b c
$ echo ${@:2?badness}
bash: @: 2?badness: `:' expected for conditional expression (error token is "badness")
$ echo ${@:2:$#-1?badness}
bash: @: 3-1?badness: `:' expected for conditional expression (error token is "badness")

zsh:

% set a b c
% echo ${@:2?badness}
zsh: bad math expression: ':' expected
% echo ${@:2:$#-1?badness}
zsh: bad math expression: ':' expected

両方に適用される方法はありますか{z,ba}sh

ベストアンサー1

zshでは、次のことができます。

printf ' - "%s"\n' "${(@)a[1,4]}" "${a[5]?Need at least 5 elements}"

Bashでも同様ですが、kshのように配列デザインのbashがほとんどコピーされていない配列の場合にのみ適用されます${a[@]:0:5}。これはインデックスがゼロより大きい最初の5つの要素を提供するため、5つ以上の要素がある可能性があります。インデックス4は設定されていないか(配列インデックスはbashで1ではなく0から始まることに注意してください)、インデックス4を持つインデックスは唯一のセットに設定されています。

a=( "${a[@]}" ) # unsparsify the array
printf ' - "%s"\n' "${a[@]:0:4}" "${a[4]?Need at least 5 elements}"

あるいは、合理的なことをして、次のように書くこともできます。

(( $#a >= 5 )) || die 'Need at least 5 elements.' # zsh
(( ${#a[@]} >= 5 )) || die 'Need at least 5 elements.' # ksh/bash (or zsh)

あまりにもカラフルにしようとする代わりに。

おすすめ記事