가변 개수의 매개변수가 포함된 스크립트가 있습니다. 또한 동일한 매개변수를 사용하여 더 추가하는 래퍼 스크립트도 있습니다. 문제는 매개변수에 공백이 있을 때 "내부" 스크립트에 전달될 때 단어로 분할된다는 것입니다.
예를 들어 외부 스크립트는 다음과 같습니다.
# tst1.sh
echo "-- tst1.sh --"
echo "1: $1"
echo "2: $2"
./tst2.sh $* --some --more --params
내부 스크립트는 다음과 같습니다.
#!/bin/bash
echo "-- tst2.sh --"
echo "1: $1"
echo "2: $2"
이제 래퍼 스크립트를 호출하면 다음과 같은 결과가 나타납니다.날짜단일 인수로는 정확하지만 내부 인수는 첫 번째 단어만 가져옵니다.
$ ./tst1.sh --date "$(date)"
-- tst1.sh --
1: --date
2: Fri Jan 25 21:51:57 GMT 2019
-- tst2.sh --
1: --date
2: Fri <== this is wrong
두 번째 스크립트의 출력이 첫 번째 스크립트와 동일해지기를 원합니다. 이 모든 것은 다양한 수의 인수에 해당됩니다. 이것이 바로 $*
인용할 수 있는 단일 인수 대신에 를 사용 하는 이유입니다 $1
.$2
인용을 시도했지만 실제 날짜 문자열이 단일 매개변수로 연결되었습니다 "$*"
.--date
무엇을 해야할지 아시나요?
답변1
사용 "$@"
:
./tst2.sh "$@" --some --more --params
$*
와 의 차이점은 "$@"
다음 $*
과 같습니다.단일 문자열모든 위치 매개변수의 연결로 구성됩니다. 여기서 첫 번째 문자는 $IFS
구분 기호입니다(이 문자열은 따옴표가 없기 때문에 추가로 토큰화되고 파일 이름이 확장됩니다). "$@"
(큰따옴표에 유의하세요!) 각 위치 매개변수에 대한 구분 기호가 됩니다.혼자 인용.
개별 위치 매개변수를 보존하려는 경우 항상 사용하십시오 "$@"
.
$IFS
생성 할 첫 번째 캐릭터에 위치 매개변수를 추가하고 싶은 경우단일 문자열, 사용 "$*"
. 텍스트 문자열을 생성할 때 특정 상황을 제외하고는 거의 사용되지 않습니다.
$*
그것을 사용하거나 인용하지 않는 것은 거의 의미가 없습니다 $@
.
"$@"
vs.의 짧은 예 "$*"
:
set -- "bumblebee 1" "bumblebee 2"
IFS=,
printf 'With "$@": %s\n' "$@"
printf 'With "$*": %s\n' "$*"
출력(설명 추가)
With "$@": bumblebee 1 <-- "$1" here
With "$@": bumblebee 2 <-- "$2" here
With "$*": bumblebee 1,bumblebee 2 <-- "$1$IFS$2" here