${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)
あまりにもカラフルにしようとする代わりに。