$*
쉘에서 그것은 무엇을 의미합니까?
두 가지 함수에 대한 코드가 있으며 run_command
다음 run_test
과 같이 호출됩니다.
if [ -n "`echo ${GOAT_COMMANDS} | grep $1`" ]; then
run_command $*
else
run_test $*
fi
이것이 무엇을 의미하는지 이해하고 싶지만 $*
Google은 이런 종류의 검색을 제대로 수행하지 못합니다.
답변1
$*
예모든 매개변수스크립트나 함수의 경우 인수를 공백으로 구분하세요.
기능이 있는 경우:
foo() {
for x in $*
do
echo $x
done
}
그런 다음 실행하면 foo 1 "2 3 4" 5
다음이 출력됩니다.
1
2
3
4
5
즉, 인용된 문자열은 "2 3 4"
세 개의 개별 "단어"로 분할됩니다.
때를아니요인수를 별도의 단어로 분리하려면 를 사용할 수 있습니다 . 대신 $@
동일한 함수를 사용하면 다음이 출력됩니다."$@"
$*
1
2 3 4
5
즉, 인용된 문자열이 별도의 단어로 분할되지 않습니다. 이는 모든 위치 매개변수를 명시적으로 나열하는 것과 같습니다 "$1" "$2" "$3" "$4" ...
. 일반적으로 이것은 아마도 여러분이 사용하고 싶은 것일 것입니다. 단어 분할은 종종 추적하기 어려운 불쾌한 오류로 이어집니다.
함수 내부가 아닌 스크립트의 최상위 수준에서 이는 스크립트 자체에 제공된 인수를 참조합니다.
run_command
귀하의 예에서는 일부 또는 run_test
모든 인수를 사용하여 이 스크립트 또는 함수를 호출하고 이를 별도의 단어로 분할합니다. 스크립트가 script.sh "hello world" 2 3
다음과 같이 실행되면 다음과 같은 효과가 나타납니다.
run_command hello world 2 3
답변2
$*
모든 매개변수를 단일 "인수"로 함수에 전달하는 것을 의미합니다. 또한 이러한 변수 주위에는 큰따옴표를 사용하는 것이 좋습니다 "$*"
.
이에 대한 일부 문서여기섹션 3.2.5
반면에 매개변수 목록에 포함된 각 매개변수를 반복해야 하는 경우 $@
다음 예와 같이 대신 사용하세요.
for var in "$@"
do
echo "$var"
done
또 다른 예는 다음과 같습니다. foo.sh
#!/bin/bash
foo1()
{
for x in "$@"
do
echo "f1: $x"
done
}
foo2()
{
for x in "$*"
do
echo "f2: $x"
done
}
foo1 1 2 "3 4 5" 6 7
echo
foo2 1 2 "3 4 5" 6 7
산출:
$ ./foo.sh
f1: 1
f1: 2
f1: 3 4 5
f1: 6
f1: 7
f2: 1 2 3 4 5 6 7
답변3
$*
모두를 의미위치 매개변수.
답변4
$*
위치 매개변수 목록이지만 단어 분할 기능이 있습니다. 예를 들어,
your_script ab "cd ef"
$*
ab
, cd
및 3개의 매개변수가 제공됩니다 ef
. (단어 분할을 원하지 않는 한) 사용하는 것이 "$@"
더 안전합니다 .