인용되지 않았을 때 $*
와 $@
같습니다. 공백이나 와일드 카드가 포함 된 인수가있는 즉시 예기치 않게 중단 될 수 있으므로이 중 하나를 사용하면 안됩니다.
"$*"
한 단어로 확장됩니다 "$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
비표준으로 설정된 경우 이후에 실행하는 명령이 제대로 작동하지 않을 수 있으므로 중요 합니다.