[linux] 쉘 스크립트에서 $ @는 무엇을 의미합니까?

@쉘 스크립트 에서 달러 기호 뒤에 at 기호 ( )가 무엇을 의미합니까?

예를 들면 다음과 같습니다.

umbrella_corp_options $@



답변

$@이다 모든 스크립트에 전달 된 매개 변수는.

예를 들어, 당신이 호출하면 ./someScript.sh foo bar다음 $@과 같아야합니다 foo bar.

당신이 할 경우 :

./someScript.sh foo bar

그런 다음 내부 someScript.sh참조 :

umbrella_corp_options "$@"

이것은 umbrella_corp_options큰 따옴표로 묶인 각 개별 매개 변수와 함께 전달되어 호출자가 공백으로 매개 변수를 가져 와서 전달할 수 있습니다.


답변

$@$*“모든 명령 행 인수”를 의미하는 거의 동일 합니다. 그들은 종종 모든 인수를 다른 프로그램에 전달하는 데 사용됩니다 (따라서 다른 프로그램 주위에 래퍼를 형성 함).

두 구문의 차이점은 공백이 포함 된 인수가 $@있고 큰 따옴표를 넣을 때 나타납니다 .

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


답변

다음은 명령 행 인수입니다.

$@= 모든 인수를 문자열 목록에
$*저장 = 모든 인수를 단일 문자열로
$#저장 = 인수 수 저장


답변

순수한 $@의미 의 사용은 대부분의 경우 “프로그래머를 가능한 많이 힘들게한다”는 의미입니다. 대부분의 경우 단어 분리와 공백 및 기타 문자가 인수에 문제가 있기 때문입니다.

모든 경우의 99 %에서 (추측 된), 그것을 묶어야합니다 ": "$@"인수를 안정적으로 반복하는 데 사용할 수있는 것입니다.

for a in "$@"; 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가 분리됩니다.


당신이 사용하고자하는 대부분의 시간은 "$@"아닙니다 $@.


답변