매개변수 $*를 공백과 함께 두 번째 스크립트에 전달합니다.

매개변수 $*를 공백과 함께 두 번째 스크립트에 전달합니다.

가변 개수의 매개변수가 포함된 스크립트가 있습니다. 또한 동일한 매개변수를 사용하여 더 추가하는 래퍼 스크립트도 있습니다. 문제는 매개변수에 공백이 있을 때 "내부" 스크립트에 전달될 때 단어로 분할된다는 것입니다.

예를 들어 외부 스크립트는 다음과 같습니다.

# 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

관련 정보