인용되지 않았을 때 $*와 $@같습니다. 공백이나 와일드 카드가 포함 된 인수가있는 즉시 예기치 않게 중단 될 수 있으므로이 중 하나를 사용하면 안됩니다.
"$*"한 단어로 확장됩니다 "$1c$2c...". 일반적으로 c공백이지만 실제로의 첫 번째 문자 IFS이므로 원하는대로 선택할 수 있습니다.
내가 찾은 유일한 용도는 다음과 같습니다.
쉼표 (간단한 버전) 로 인수 결합
join1() {
typeset IFS=,
echo "$*"
}
join1 a b c # => a,b,c
지정된 분리 문자로 인수를 결합하십시오 (더 나은 버전)
join2() {
typeset IFS=$1 # typeset makes a local variable in ksh (see footnote)
shift
echo "$*"
}
join2 + a b c # => a+b+c
"$@" 단어를 분리하여 확장합니다. "$1" "$2" ...
이것은 거의 항상 당신이 원하는 것입니다. 각 위치 매개 변수를 별도의 단어로 확장하여 명령 행 또는 함수 인수를 가져 와서 다른 명령 또는 함수로 전달하는 데 적합합니다. 큰 따옴표를 사용하여 확장되므로 "$1"공백이나 별표 ( *) 가 포함되어 있으면 문제가 발생하지 않습니다 .
의라는 스크립트를 만들어 보자 svim실행 vim과를 sudo. 차이점을 설명하기 위해 세 가지 버전을 수행합니다.
svim1
#!/bin/sh
sudo vim $*
svim2
#!/bin/sh
sudo vim "$*"
svim3
#!/bin/sh
sudo vim "$@"
공백이 포함되지 않은 단일 파일 이름과 같은 간단한 경우에는 모두 적합합니다.
svim1 foo.txt # == sudo vim foo.txt
svim2 foo.txt # == sudo vim "foo.txt"
svim2 foo.txt # == sudo vim "foo.txt"
그러나 단지 $*및 "$@"여러 인수를 일이 적절합니다.
svim1 foo.txt bar.txt # == sudo vim foo.txt bar.txt
svim2 foo.txt bar.txt # == sudo vim "foo.txt bar.txt" # one file name!
svim3 foo.txt bar.txt # == sudo vim "foo.txt" "bar.txt"
그리고 단지 "$*"및 "$@"작업 제대로 공백을 포함하는 인수가 있다면.
svim1 "shopping list.txt" # == sudo vim shopping list.txt # two file names!
svim2 "shopping list.txt" # == sudo vim "shopping list.txt"
svim3 "shopping list.txt" # == sudo vim "shopping list.txt"
따라서 "$@"항상 제대로 작동합니다.
typeset에서 지역 변수를 만드는 방법입니다 ksh( bash및 ash사용 local대신). IFS함수가 반환되면 이전 값으로 복원 됨을 의미 합니다. IFS비표준으로 설정된 경우 이후에 실행하는 명령이 제대로 작동하지 않을 수 있으므로 중요 합니다.