쉘 또는 서브쉘에서 코드를 실행하는 것 사이에 이러한 차이가 예상됩니까?
$ a() { echo ${@: -1} ; }
$ echo "echo ${*: -1}" > b
$ chmod +x b
$ a 1 2 3
3
$ ./b 1 2 3
bash
$
데비안 시드
배쉬 버전 5.2.15
답변1
여기:
$ echo "echo ${*: -1}" > b
"${*: -1}"
큰따옴표로 묶여 있으므로 즉시 확장됩니다 . or와 함께 슬라이스 표기법을 사용하면 , , ...부터 시작하는 위치 인수 목록뿐만 아니라 , , ...의 목록도 $*
살펴봅니다 . $@
음수 인덱스는 끝에서부터 거꾸로 계산되므로 at에서 시작하면 목록의 마지막 요소가 제공됩니다.$0
$1
$1
-1
대화형 셸에는 위치 인수가 없을 수 있으므로 이 목록의 마지막 요소는 $0
셸 이름을 지정하는 데 사용됩니다. 귀하의 경우에는 해당되는 것으로 보이며 bash
파일 b
에는 echo bash
.
함수 내에서 ${@: -1}
함수 자체의 위치 매개변수를 확인하세요. 그 중 마지막 매개변수는 입니다 3
.
echo ${*: -1}
문자열을 파일에 저장하려면 작은따옴표를 사용하여 확장을 방지하세요. 확장이 발생할 때 인용할 수 있도록 큰따옴표를 추가하는 것도 좋은 생각입니다.
echo 'echo "${*: -1}"' > c
그러나 여기에는 서브셸이 없으며 함수와 외부 스크립트만 있습니다.