Linux에서 $ * 및 $ #은 무엇입니까?


76

Linux에서 다음 환경 변수는 무엇을 의미합니까?

  1. $ * (달러 기호 뒤에 별표가 오는)는 무엇입니까?
  2. $ # (해쉬 마크 / 숫자 기호 / 옥토 소프 / 파운드 기호 옆의 달러 기호) 란 무엇입니까?

답변:


106

에서 이리 :

$#    Stores the number of command-line arguments that 
      were passed to the shell program.
$?    Stores the exit value of the last command that was 
      executed.
$0    Stores the first word of the entered command (the 
      name of the shell program).
$*    Stores all the arguments that were entered on the
      command line ($1 $2 ...).
"$@"  Stores all the arguments that were entered
      on the command line, individually quoted ("$1" "$2" ...).

그래서 기본적으로, $# 스크립트가 실행될 때 주어진 여러 가지 인수입니다. $* 모든 인수를 포함하는 문자열입니다. 예를 들어, $1 첫 번째 인수 등입니다. 스크립트의 특정 인수에 액세스하려는 경우 유용합니다.

Brian이 언급 한 것처럼 간단한 예제가 있습니다. 다음 명령을 실행하는 경우 :

./command -yes -no /home/username
  • $# = 3
  • $* = -yes -no /home/username
  • $@ = 배열 : {"-yes", "-no", "/home/username"}
  • $0 = ./command, $1 = -yes 기타

이것들은 POSIX 표준 모든 준수 쉘이 지원해야합니다. 아래의 참고 자료는 각 특수 매개 변수에 대한 POSIX 표준 정의입니다. 세 가지 추가 변수가 있음을 유의하십시오. $-, $$$!.

$@:

하나부터 시작하여 위치 매개 변수로 확장됩니다. 확장이 큰 따옴표 내에서 발생하고 필드 분리가 발생하면 (see section 필드 분할 )가 수행 될 때, 각 위치 매개 변수는 별도의 필드로 확장되어야하며, 첫 번째 매개 변수의 확장은 원래 단어의 시작 부분과 결합되어야한다 (확장 된 매개 변수가 단어 내에 포함되었다고 가정). 마지막 매개 변수의 확장은 원래 단어의 마지막 부분과 조인되어야한다. 위치 매개 변수가 없으면 '@'의 확장은 '@'가 큰 따옴표로 묶여 있더라도 0 필드를 생성합니다.

$*:

하나부터 시작하여 위치 매개 변수로 확장됩니다. 확장이 큰 따옴표로 묶인 문자열에서 발생하면 (see section 큰 따옴표 ), IFS 변수의 첫 문자로 분리 된 각 매개 변수의 값 또는 IFS가 설정되지 않은 경우 a로 단일 필드로 확장됩니다. IFS가 널 (NULL) 문자열로 설정된 경우, 이는 설정 해제와 동일하지 않습니다. 첫 번째 문자가 존재하지 않으므로 매개 변수 값이 연결됩니다.

$#:

위치 매개 변수의 십진수로 확장됩니다. 명령 이름 (매개 변수 0)은 위치 매개 변수가 아닌 특수 매개 변수이기 때문에 '#'에 의해 주어진 수로 계산되지 않습니다.

$?:

가장 최근의 파이프 라인의 십진수 종료 상태로 확장됩니다 ( 파이프 라인 ).

$-:

(하이픈.) 현재 옵션 플래그 (문자열에 연결된 단일 문자 옵션 이름)를 호출시 지정된대로 확장합니다. 세트 특수 내장 명령 또는 암시 적으로 쉘에 의해 수행됩니다.

$$:

호출 된 쉘의 10 진수 프로세스 ID로 확장됩니다. 서브 쉘 ( 셸 실행 환경 ), '$'는 현재 쉘과 동일한 값으로 확장됩니다.

$!:

가장 최근의 백그라운드 명령의 10 진수 프로세스 ID로 확장됩니다 ( 기울기 )를 현재 셸에서 실행합니다. 예를 들어, 서브 쉘에서 실행 된 백그라운드 명령은 현재 쉘 환경의 "$!"값에 영향을주지 않습니다. 파이프 라인의 경우 프로세스 ID는 파이프 라인의 마지막 명령의 ID입니다.

$0:

(제로.) 쉘 또는 쉘 스크립트의 이름으로 확장됩니다. 만나다 이 이름의 파생 방법에 대한 자세한 설명은


1
이러한 특수 매개 변수는 Bourne에서 파생 된 모든 쉘 (예 : sh, bash, dash, ash, ksh, zsh)에 해당됩니다.
Dennis Williamson

보정: $*$# 1) 환경 변수가 아닌 셸 변수입니다. 2) 표준화 (POSIX 사양의 일부)
grawity

3
또한 주목하십시오 "$@" 많은 시간은 다음과 같이 쓰여진다. ${1+"$@"} (이식성을 이유로) stackoverflow.com/questions/743454/... 설명을 위해.
hlovdal

'명령 이름 (매개 변수 0)은 계산되지 않아야합니다 ...'위의 예에서 0부터 세는 시작은 $ # = 2입니다.
Josef Klimuk

0

$# 인수의 수를 나타냅니다.

[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1

[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3

2
슈퍼 유저에 오신 것을 환영합니다. 이 사이트는 지식 기반이므로 각 응답이 이미 제공되지 않은 질문에 대한 해결책을 제공한다는 것이 목적입니다. 이는 질문의 절반 만 다루며, 정보는 이미 이전 답변에서 다루었습니다.
fixer1234
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.