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


답변:


242

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

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

당신이 할 경우 :

./someScript.sh foo bar

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

umbrella_corp_options "$@"

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


1
내가했을 경우 $ @에 무엇을 포함 할 someScript.sh foo bar "boo far"것인가?
trusktr


7
큰 따옴표로 작성된 경우 $ @는 특별합니다. 그런 다음 세 가지 인수 "foo", "bar"및 "boo far"에 인용 된 값 목록 (이 경우 trusktr)이 표시됩니다.
Alfe

4
일반적으로 그렇 더라도 반드시 스크립트로 전달 된 매개 변수에서 오는 $@것은 아닙니다 . set a b "x   y"; printf '(%s)' "$@"출력(a)(b)(x   y)
Peter.O

더 나은에 AlFe의 대답처럼 나는 그가 사이의 주요 차이점 제공하기 때문에 $@$*
donleyp

106

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

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

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

2
그것들은 동일 하지 않으며 맨 페이지는 공간이 아닌 IFS를 사용하여 $ *의 부작용에 대해 분명합니다. (동일한 경우 두 가지를 모두 제공하는 데있어서 호환성 외에 다른 점은 없을 것입니다.)
jørgensen

6
아닙니다. 그리고 나는 두 줄로 다음과 같이 말했습니다. "두 가지의 차이점 ..."짧은 문장을 얻고 가독성을 높이기 위해 독자는 평결을 내리기 전에 한 문장 이상을 읽어야합니다 :-/
Alfe

2
Alfe, Christoffer는 그 단어를 "거의"거의 삽입하지 않았기 때문에 간결함이나 가독성을 희생시키지 않으면 서 큰 차이를 만들었습니다. 사실 나는 그 차이 에 대한 미묘한 강조로 인해이 답변을 받아 들였습니다 ( 거의 수락 된 것과는 반대) ...- 당신의 의지에 거의 반한다는 것을 깨닫기 전에! ;)
Sz.

나는 첫 번째 문장을 읽은 직후에 평결을 내리는 사람들에게 단어가 큰 차이를 만들어 냈다고 생각합니다. 이 사람들을 위해서도 글을 쓰고 싶습니다.
Alfe

매우 불분명합니다. wrappedProgram "$*"-> separated by single spaces.그러나 두 번째 예에서는 단일 공백으로 구분되지 않습니다.
Felix Dombek

36

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

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


(@iruvar가 고정함으로써 상기 설명한 부정확성.)
Mateen Ulhaq

13

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

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

for a in "$@"; do something_with "$a"; done

4
당신의 라인은 다음과 같이 쓸 수 있습니다 : for a; "$ a"로 something_; 완료 ;-)
Alfe

1
내가 알고있는 @Alfe; 나는 단지 그것을 잊었다. 그것을 생각하십시오 for a in start_token "$@" end_token; do something_with "$a"; done:-)
glglgl

9

매뉴얼에서 :

@

위치 매개 변수부터 시작하여 위치 매개 변수로 확장됩니다. 큰 따옴표 내에서 확장이 발생하면 각 매개 변수가 별도의 단어로 확장됩니다. 즉, "$ @"은 "$ 1" "$ 2"...와 같습니다. 큰 따옴표로 묶인 확장이 단어 내에서 발생하면 첫 번째 매개 변수의 확장은 원래 단어의 시작 부분과 결합됩니다. 마지막 매개 변수의 확장은 원래 단어의 마지막 부분과 결합됩니다. 위치 매개 변수가 없으면 "$ @"및 $ @는 아무것도 확장하지 않습니다 (즉, 제거됨).


1

의미.

간단히 말해, $@호출자에서 함수 또는 스크립트로 전달 된 위치 인수로 확장됩니다 . 의미는 상황에 따라 다릅니다 . 함수 안에서 함수에 전달 된 인수로 확장됩니다. 스코프 내부가 아닌 스크립트에서 함수를 사용하면 해당 스크립트에 전달 된 인수로 확장됩니다.

$ cat my-sh
#! /bin/sh
echo "$@"

$ ./my-sh "Hi!"
Hi!
$ put () ( echo "$@" )
$ put "Hi!"
Hi!

단어 분리.

이제 $@쉘에서 동작 하는 방식을 이해할 때 가장 중요한 또 다른 주제 는 단어 분할 입니다. 쉘은 IFS변수 의 내용에 따라 토큰을 분할 합니다. 기본값은\t\n ; 즉, 공백, 탭 및 줄 바꿈.

확장 "$@"하면 전달 된 인수 의 원래 사본 이 제공 됩니다. 그러나 확장 $@이 항상 그런 것은 아닙니다. 보다 구체적으로, 인수에의 문자가 포함되어 있으면 인수 IFS가 분리됩니다.


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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.