${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}. 이는 인덱스가 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)

너무 화려하려고 노력하는 대신.

관련 정보