${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}
. 이는 인덱스가 0보다 큰 처음 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)
너무 화려하려고 노력하는 대신.