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
세 번째 행은의 첫 번째 문자 인 $IFS
Internal 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
'Programing' 카테고리의 다른 글
가운데에 하나의 유연한 열이있는 두 개의 고정 너비 열을 어떻게 가질 수 있습니까? (0) | 2020.03.20 |
---|---|
C ++ 함수에 2D 배열 전달 (0) | 2020.03.20 |
객체를 문자열로 직렬화 (0) | 2020.03.20 |
모든 자식 푸시에서 사용자 이름과 비밀번호를 지정하지 않으려면 어떻게합니까? (0) | 2020.03.20 |
'innerText'는 IE에서는 작동하지만 Firefox에서는 작동하지 않습니다. (0) | 2020.03.20 |