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으로 확장됩니다(즉, 삭제됩니다.
$@는 $*와 동일하지만 각 파라미터는 따옴표로 둘러싸인 문자열입니다.즉, 파라미터는 해석이나 확장 없이 그대로 전달됩니다.이는 무엇보다도 인수 목록의 각 매개 변수가 개별 단어로 인식된다는 것을 의미합니다.
물론 "$@"는 따옴표로 묶어야 합니다.
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
'programing' 카테고리의 다른 글
DLL 파일이란 정확히 무엇이며 어떻게 작동합니까? (0) | 2023.04.21 |
---|---|
Azure Cosmos DB - 파티션 키 이해 (0) | 2023.04.21 |
Conda가 기본 환경을 활성화하지 않도록 하려면 어떻게 해야 합니까? (0) | 2023.04.21 |
TableViewController, iOS - Swift에서 여분의 빈 셀을 삭제하는 방법 (0) | 2023.04.21 |
iOS7에서 상태 표시줄을 숨길 수 없음 (0) | 2023.04.21 |