Bash에서 변수를 다른 프로그램($* 또는 $@)에 전달하는 가장 안전한 방법은 무엇입니까? [복사]

Bash에서 변수를 다른 프로그램($* 또는 $@)에 전달하는 가장 안전한 방법은 무엇입니까? [복사]

누군가 이 두 변수의 차이점을 간결하게 설명해 줄 수 있나요?

변수를 다른 프로그램에 전달하는 가장 안전한 방법은 무엇입니까?

예를 들어

#! /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. 문제의 표기법에서 Xis 는 "$@"하나 이상의 인수가 알려진 경우 인수 목록입니다. 그렇지 않으면 인수가 없습니다. 이는 "$@"현대의 쉘과 동일한 의미를 갖습니다.

관련 정보