@
쉘 스크립트 에서 달러 기호 뒤에 at 기호 ( )가 무엇을 의미합니까?
예를 들면 다음과 같습니다.
umbrella_corp_options $@
@
쉘 스크립트 에서 달러 기호 뒤에 at 기호 ( )가 무엇을 의미합니까?
예를 들면 다음과 같습니다.
umbrella_corp_options $@
답변:
$@
이다 모든 스크립트에 전달 된 매개 변수는.
예를 들어, 당신이 호출하면 ./someScript.sh foo bar
다음 $@
과 같아야합니다 foo bar
.
당신이 할 경우 :
./someScript.sh foo bar
그런 다음 내부 someScript.sh
참조 :
umbrella_corp_options "$@"
이것은 umbrella_corp_options
큰 따옴표로 묶인 각 개별 매개 변수와 함께 전달되어 호출자가 공백으로 매개 변수를 가져 와서 전달할 수 있습니다.
someScript.sh foo bar "boo far"
것인가?
$@
것은 아닙니다 . set a b "x y"; printf '(%s)' "$@"
출력(a)(b)(x y)
$@
와$*
$@
는 $*
"모든 명령 행 인수"를 의미하는 거의 동일 합니다. 그들은 종종 모든 인수를 다른 프로그램에 전달하는 데 사용됩니다 (따라서 다른 프로그램 주위에 래퍼를 형성 함).
두 구문의 차이점은 공백이 포함 된 인수가 $@
있고 큰 따옴표를 넣을 때 나타납니다 .
wrappedProgram "$@"
# ^^^ this is correct and will hand over all arguments in the way
# we received them, i. e. as several arguments, each of them
# containing all the spaces and other uglinesses they have.
wrappedProgram "$*"
# ^^^ this will hand over exactly one argument, containing all
# original arguments, separated by single spaces.
wrappedProgram $*
# ^^^ this will join all arguments by single spaces as well and
# will then split the string as the shell does on the command
# line, thus it will split an argument containing spaces into
# several arguments.
예 : 전화
wrapper "one two three" four five "six seven"
결과 :
"$@": wrappedProgram "one two three" four five "six seven"
"$*": wrappedProgram "one two three four five six seven"
^^^^ These spaces are part of the first
argument and are not changed.
$*: wrappedProgram one two three four five six seven
wrappedProgram "$*"
-> separated by single spaces.
그러나 두 번째 예에서는 단일 공백으로 구분되지 않습니다.
다음은 명령 행 인수입니다.
$@
= 모든 인수를 문자열 목록에
$*
저장 = 모든 인수를 단일 문자열로
$#
저장 = 인수 수 저장
순수한 $@
의미 의 사용은 대부분의 경우 "프로그래머를 가능한 많이 힘들게한다"는 의미입니다. 대부분의 경우 단어 분리와 공백 및 기타 문자가 인수에 문제가 있기 때문입니다.
모든 경우의 99 %에서 (추측 된), 그것을 묶어야합니다 "
: "$@"
인수를 안정적으로 반복하는 데 사용할 수있는 것입니다.
for a in "$@"; do something_with "$a"; done
for a in start_token "$@" end_token; do something_with "$a"; done
:-)
@
위치 매개 변수부터 시작하여 위치 매개 변수로 확장됩니다. 큰 따옴표 내에서 확장이 발생하면 각 매개 변수가 별도의 단어로 확장됩니다. 즉, "$ @"은 "$ 1" "$ 2"...와 같습니다. 큰 따옴표로 묶인 확장이 단어 내에서 발생하면 첫 번째 매개 변수의 확장은 원래 단어의 시작 부분과 결합됩니다. 마지막 매개 변수의 확장은 원래 단어의 마지막 부분과 결합됩니다. 위치 매개 변수가 없으면 "$ @"및 $ @는 아무것도 확장하지 않습니다 (즉, 제거됨).
간단히 말해, $@
호출자에서 함수 또는 스크립트로 전달 된 위치 인수로 확장됩니다 . 의미는 상황에 따라 다릅니다 . 함수 안에서 함수에 전달 된 인수로 확장됩니다. 스코프 내부가 아닌 스크립트에서 함수를 사용하면 해당 스크립트에 전달 된 인수로 확장됩니다.
$ cat my-sh
#! /bin/sh
echo "$@"
$ ./my-sh "Hi!"
Hi!
$ put () ( echo "$@" )
$ put "Hi!"
Hi!
이제 $@
쉘에서 동작 하는 방식을 이해할 때 가장 중요한 또 다른 주제 는 단어 분할 입니다. 쉘은 IFS
변수 의 내용에 따라 토큰을 분할 합니다. 기본값은\t\n
; 즉, 공백, 탭 및 줄 바꿈.
확장 "$@"
하면 전달 된 인수 의 원래 사본 이 제공 됩니다. 그러나 확장 $@
이 항상 그런 것은 아닙니다. 보다 구체적으로, 인수에의 문자가 포함되어 있으면 인수 IFS
가 분리됩니다.
당신이 사용하고자하는 대부분의 시간은 "$@"
아닙니다 $@
.