누군가 이 두 변수의 차이점을 간결하게 설명해 줄 수 있나요?
변수를 다른 프로그램에 전달하는 가장 안전한 방법은 무엇입니까?
예를 들어
#! /bin/bash
# do stuff
# pass variables onto another program
java $@
답변1
다음 스크립트를 사용하세요.
#! /bin/sh
# Greg Wooledge's args script
printf "%d args:" $#
printf " <%s>" "$@"
echo
이 데모를 시도해 보세요:
$ set -- a 'b c' d
$ args $*
4 args: <a> <b> <c> <d>
$ args $@
4 args: <a> <b> <c> <d>
$ args "$*"
1 args: <a b c d>
$ args "$@"
3 args: <a> <b c> <d>
일반적으로 (따옴표 포함)을 사용해야 합니다 "$@"
.
때로는 IFS
다음을 변경하고 사용하는 것이 유용합니다 "$*"
.
$ saveIFS=$IFS; IFS='|'; args "$*"; IFS=$saveIFS
1 args: <a|b c|d>
답변2
"$@"
확장 없이 arglist를 전달하고 각 인수를 분리하므로 가장 안전합니다 . 바라보다http://www.faqs.org/docs/abs/HTML/variables2.html#ARGLIST더 알아보기.
답변3
용도: "$@"
원래 매개변수(매개변수 없음 포함)를 정확하게 표현하려는 경우.
언급할 수 있는 5가지 기호가 있습니다.
$@
$*
"$@"
"$*"
${1+"$@"}
처음 두 개는 동일합니다. 둘 다 인수 목록의 단어를 분할하여 호출되는 명령에 전달합니다. 올바른 선택이 되는 경우는 거의 없습니다.
후자의 두 가지는 완전히 다릅니다. 이 "$@"
표기법은 셸의 인수(또는 명령에 의해 설정된 인수)를 호출 명령에 효과적으로 set
복사하여 인수 수, 인수의 공백 및 인수 간의 구분을 유지합니다. 인수가 0이면 아무것도 생성되지 않습니다.
이 "$*"
표기법은 모든 매개변수를 단일 문자열에 붙여넣어 매개변수 사이에 공백을 배치하고 매개변수 내에 공백을 유지합니다. 다음과 같은 상황에 사용하기에 적합합니다.
echo "You said, '$*'"
원래 명령줄에 대한 최대 충실도는 중요하지 않습니다.
마지막 기호는 ${1+"$@"}
이전 쉘 스크립트에서 접할 수 있는 과거의 기호입니다. 옛날 옛적에(오래 전 - 예를 들어 30년 전) "$@"
Bourne 쉘은 매개변수가 없을 때 이를 하나의 빈 매개변수로 처리했습니다. 이 동작은 오랫동안 나타나지 않았지만 오래 전에 작성된 일부 스크립트는 여전히 이 표기법을 사용하여 스스로를 보호할 수 있습니다. 이 ${1+X}
기호는 " $1
빈 문자열이라도 무엇이든 설정된 경우 값을 제공한다" 는 의미입니다 X
. 문제의 표기법에서 X
is 는 "$@"
하나 이상의 인수가 알려진 경우 인수 목록입니다. 그렇지 않으면 인수가 없습니다. 이는 "$@"
현대의 쉘과 동일한 의미를 갖습니다.