programing

bash 명령줄 args $@ vs $*에 액세스합니다.

batch 2023. 4. 21. 20:23
반응형

bash 명령줄 args $@ vs $*에 액세스합니다.

많은 SO 질문 및 bash 튜토리얼에서는 bash 스크립트의 명령줄 arg에 다음 두 가지 방법으로 액세스할 수 있습니다.

$ ~ >cat testargs.sh 
#!/bin/bash

echo "you passed me" $*
echo "you passed me" $@

그 결과:

$ ~> bash testargs.sh arg1 arg2
you passed me arg1 arg2
you passed me arg1 arg2

와의 차이는 무엇입니까?$*그리고.$@?
전자는 언제, 후자는 언제 사용해야 하는가?

특수 매개 변수가 따옴표로 묶이면 차이가 표시됩니다.차이점을 설명하겠습니다.

$ set -- "arg  1" "arg  2" "arg  3"

$ for word in $*; do echo "$word"; done
arg
1
arg
2
arg
3

$ for word in $@; do echo "$word"; done
arg
1
arg
2
arg
3

$ for word in "$*"; do echo "$word"; done
arg  1 arg  2 arg  3

$ for word in "$@"; do echo "$word"; done
arg  1
arg  2
arg  3

견적의 중요성에 대한 또 다른 예: "arg"와 숫자 사이에는 2개의 공백이 있지만 $word를 인용할 수 없는 경우:

$ for word in "$@"; do echo $word; done
arg 1
arg 2
arg 3

그리고 bash에서는"$@"를 반복하는 「디폴트」리스트입니다.

$ for word; do echo "$word"; done
arg  1
arg  2
arg  3

Bash Hackers Wiki의 편리한 개요 표:

구문 효과적 결과
$* $1 $2 $3 … ${N}
$@ $1 $2 $3 … ${N}
"$*" "$1c$2c$3c…c${N}"
"$@" "$1" "$2" "$3" … "${N}"

어디에c세 번째 줄에 있는 것은 첫 번째 캐릭터입니다$IFS, 셸 변수인 입력 필드 구분 기호.

인수를 저장하는 경우 배열 변수에 인수를 로드합니다.

$*

1부터 시작하여 위치 매개변수로 확장합니다.큰따옴표 내에서 전개되는 경우 IFS 특수변수의 첫 번째 문자로 구분된 각 파라미터 값을 사용하여 단일 단어로 전개됩니다.즉, "$*"는 "$1c$2c..."에 해당합니다.여기서 c는 IFS 변수 값의 첫 번째 문자입니다.IFS가 설정되어 있지 않은 경우 파라미터는 공백으로 구분됩니다.IFS가 늘인 경우 파라미터는 세퍼레이터에 개입하지 않고 결합됩니다.

$@

1부터 시작하여 위치 매개변수로 확장합니다.큰따옴표 내에서 확장이 발생하는 경우 각 파라미터는 별도의 단어로 확장됩니다.즉, "$@"는 "$1" "$2"에 해당합니다.단어 내에서 쌍따옴표로 둘러싸인 전개는 첫 번째 파라미터의 전개는 원래 워드의 시작 부분과 결합되고 마지막 파라미터의 전개는 원래 워드의 마지막 부분과 결합된다.위치 파라미터가 없는 경우 "$@" 및 "$@"는 0으로 확장됩니다(즉, 삭제됩니다.

출처 : Bash man

$@는 $*와 동일하지만 각 파라미터는 따옴표로 둘러싸인 문자열입니다.즉, 파라미터는 해석이나 확장 없이 그대로 전달됩니다.이는 무엇보다도 인수 목록의 각 매개 변수가 개별 단어로 인식된다는 것을 의미합니다.

물론 "$@"는 따옴표로 묶어야 합니다.

http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST

이 예에서는 "at"와 "asterix"의 사용 중 차이를 강조 표시할 수 있습니다.2개의 어레이를 '과일'과 '채소'라고 선언했습니다.

fruits=(apple pear plumm peach melon)            
vegetables=(carrot tomato cucumber potatoe onion)

printf "Fruits:\t%s\n" "${fruits[*]}"            
printf "Fruits:\t%s\n" "${fruits[@]}"            
echo + --------------------------------------------- +      
printf "Vegetables:\t%s\n" "${vegetables[*]}"    
printf "Vegetables:\t%s\n" "${vegetables[@]}"    

위의 코드를 참조하여 다음 결과를 참조하십시오.

Fruits: apple pear plumm peach melon
Fruits: apple
Fruits: pear
Fruits: plumm
Fruits: peach
Fruits: melon
+ --------------------------------------------- +
Vegetables: carrot tomato cucumber potatoe onion
Vegetables: carrot
Vegetables: tomato
Vegetables: cucumber
Vegetables: potatoe
Vegetables: onion

언급URL : https://stackoverflow.com/questions/12314451/accessing-bash-command-line-args-vs

반응형