Programing

bash 명령 행 인수에 액세스 $ @ vs $ *

lottogame 2020. 3. 20. 08:12
반응형

bash 명령 행 인수에 액세스 $ @ vs $ *


많은 SO 질문과 bash 자습서에서 bash 스크립트의 명령 줄 args에 두 가지 방법으로 액세스 할 수 있음을 알았습니다.

$ ~ >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 의 멋진 편리한 개요 테이블 :

$ * 대 $ @ 테이블

여기서 c세 번째 행은의 첫 번째 문자 인 $IFSInternal Field Separator (쉘 변수)입니다.

인수가 스크립트 변수에 저장되고 인수에 공백이 포함될 것으로 예상 "$*"되면 내부 필드 구분 기호 $IFS를 tab으로 설정하여 트릭을 사용하는 것이 좋습니다 .


$ *

위치 매개 변수부터 시작하여 위치 매개 변수로 확장됩니다. 큰 따옴표 내에서 확장이 발생하면 각 매개 변수의 값이 IFS 특수 변수의 첫 문자로 구분되어 단일 단어로 확장됩니다. 즉, "$ *"는 "$ 1c $ 2c ..."와 같습니다. 여기서 c는 IFS 변수 값의 첫 문자입니다. IFS가 설정되지 않은 경우 매개 변수는 공백으로 구분됩니다. IFS가 널인 경우 매개 변수는 중간 구분 기호없이 결합됩니다.

$ @

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

출처 : 배쉬 맨


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

물론 "$ @"는 인용해야합니다.

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


이 예에서는 "at"와 "asterix"의 차이점을 강조 표시 할 수 있습니다. 나는 "과일"과 "야채"두 배열을 선언

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

반응형