${parameter:?word} prints the given error message if a variable is unset:
$ echo ${unset_var?badness}
bash: unset_var: badness
How to use this on an array?
$ array=(a b c)
$ echo "${array[@]:1:2}"
b c
With:
$ echo "${array[@]:1:2?Need at least two arguments}"
bash complains:
bash: array[@]: a: expression recursion level exceeded (error token is "a")
zsh complains:
zsh: bad math expression: operator expected at `a least tw...'
This also "works" differently with positional parameters:
$ echo ${1?Argument not given}
bash: 1: Argument not given
We can print a range in an array, eg:
$ set a b c
$ echo ${@:2}
b c
Or, alternatively:
$ 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
Is there a way that works in both {z,ba}sh?

