두 개의 매개변수가 있을 때 다음 코드를 실행하고 있습니다.
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}"