${@:-1}은 실제로 마지막 매개변수를 반환합니까?

${@:-1}은 실제로 마지막 매개변수를 반환합니까?

두 개의 매개변수가 있을 때 다음 코드를 실행하고 있습니다.

if (( $# == 2 )); then
  : ${fdir:="${@:-1}"}
  pfm -w2 "" "unspecified -d option"
  echo "use last argument as substitute"
  printf '%s\n\n' "fdir: ${@:-1}"
  echo "\$1: $1  \$2: $2"

이것이 결과이다

pregion --dyn "John" ./01cuneus
pregion --dyn John ./01cuneus

unspecified -d option
use last argument as substitute
fdir: John

./01cuneus

$1: John  $2: ./01cuneus

답변1

아니요, "${@:-1}"없습니다. 하지만 "${@: -1}"그것은.

그러나 적어도 Bash 및 Ksh에서는 위치 인수가 제공되지 않으면 쉘 이름이 "${@: -1}"제공됩니다 "$0". 이는 위치 인수가 모든 위치에 ${@:0}제공되는 경우 와 유사합니다 . Zsh는 을 제공 하거나 정리 $0하지 않는 것 같습니다 .$0${@: -1}${@[-1]}

여기서 문제는 이것이 ${var:-value}기본 확장으로 확장되는 표준 확장이라는 것입니다.만약에변하기 쉬운설정되지 않았거나 비어 있습니다. 하위 문자열/배열 슬라이스 확장 ${var:p:n}${@: -1}표준이 아니며 쉘에서 ${@:-1}기본 확장으로 해석되는 특수한 경우입니다 $@. 공백은 명확하므로 인덱스를 변수에 넣습니다.i=-1; echo "${@:i}"

set -- a b c        
echo "${@: -1}"       # prints 'c', the last element
echo "${@:-1}"        # prints 'a b c'

set -- 
echo "${@: -1}"       # prints '/bin/bash' or something like that
echo "${@:-1}"        # prints '1', the default value given
echo "${@:-no args}"  # prints 'no args'

또한 주석에서 언급했듯이 in 확장은 : ${fdir:="${@:-1}"}인용되지 않으므로 쉘이 임의로 긴 파일 이름 목록을 생성할 가능성이 있습니다. 이는 : "${fdir:="${@: -1}"}"더 읽기 쉬운 방법으로 방지할 수 있습니다.[ -z "$fdir"] && fdir="${@: -1}"

관련 정보