특수 달러 기호 쉘 변수는 무엇입니까?


781

Bash에는 일관되고 의미있는 특수 값을 보유하는 여러 변수가있는 것으로 보입니다. 예를 들어

./myprogram &; echo $!

배경 프로세스의 PID를 반환합니다 myprogram. $?현재 TTY라고 생각되는 다른 사람들을 알고 있습니다 . 다른 사람이 있습니까?


15
그들 중 일부는 Bash 전용이 아닙니다. 다른 Bourne 관련 쉘에서도 사용되며 실제로 POSIX에 의해 지정됩니다 .
추후 공지가있을 때까지 일시 중지되었습니다.

1
어떻습니까 : IFS = $ '\ n'참조 : stackoverflow.com/questions/4128235/…
sgu

1
@sgu 매개 변수가 아닙니다. 그것은 특별한 유형의 인용입니다. $'\n'은 digraph \n를 ASCII 10으로 대체 한 문자 그대로의 개행 문자입니다 .
chepner

당신이 찾고 여기 온 경우 ${1}, ${*}등, 중괄호는 명확성을 위해, 그리고 종종 중복. 격리 된 ${x}것과 정확히 같습니다 $x.
tripleee

무슨 $!뜻입니까? 나는 알고 !$있지만 그렇지 않습니다.
Sridhar Sarnobat

답변:


1357
  • $1, $2, $3, ...있는 위치 파라미터 .
  • "$@"는 모든 위치 매개 변수의 배열과 유사한 구성입니다 {$1, $2, $3 ...}.
  • "$*"모든 위치 매개 변수의 IFS 확장입니다 $1 $2 $3 ....
  • $# 위치 매개 변수의 수입니다.
  • $- 쉘에 대해 설정된 현재 옵션.
  • $$ 현재 쉘의 pid (서브 쉘 아님).
  • $_ 가장 최근 매개 변수 (또는 시작 직후에 현재 쉘을 시작하는 명령의 abs 경로).
  • $IFS (입력) 필드 구분 기호입니다.
  • $? 가장 최근의 포 그라운드 파이프 라인 종료 상태입니다.
  • $! 가장 최근의 백그라운드 명령의 PID입니다.
  • $0 쉘 또는 쉘 스크립트의 이름입니다.

위의 대부분은 Bash Reference Manual의 Special Parameters 에서 찾을 수 있습니다 . 쉘이 설정 한 모든 환경 변수 가 있습니다 .

종합적인 색인은 Reference Manual Variable Index 를 참조하십시오 .


2
그것들은 모두 bash맨 페이지에 문서화되어 있습니다. 유일한 이상한 점은 변수 $_에서 사용되는 맥락에서만 언급됩니다 MAILPATH.
chepner

4
에서 @chepner 모양 man(1) bash에 따라 특수 매개 변수 의 정의의 나머지 부분에 대한 $_.
kojiro

8
후자는 때때로 실패하기 때문에 bash 스크립트 !$대신 사용 $_합니다.
amc

좋은 목록 kojiro. 이 구문에서 $ {1 + "$ @"}을 실행했는데 그 의미는 무엇입니까?
user178047

3
@amc : 참조 unix.stackexchange.com/questions/271659/... 사이의 차이 !$$_.
tricasse

44
  • $_ 마지막 명령의 마지막 인수
  • $# 현재 스크립트에 전달 된 인수 수
  • $*/ $@문자열 / 구분 목록으로 스크립트에 전달 된 인수 목록

내 머리 꼭대기에서. bash 특수 변수 용 Google.


124
"그렇습니다. 그들은 나를 여기로 보냈습니다." -Bookshop skit (공식 문서 : gnu.org/software/bash/manual/bashref.html#Special-Parameters )
greggo

1
나는 $@문자열 이라고 생각 $*하고 구분 된 목록입니다 (어쨌든 위의 대답에 따르면).
RastaJedi

1
@RastaJedi : "$@"목록으로 "$*"확장하고 단일 문자열로 확장합니다. $@큰 따옴표 안에있을 때 의 특수 동작이 적용됩니다.
Keith Thompson

6
이것은 매우 완전하거나 유용한 답변이 아니기 때문에 다운 보트되었습니다. "Google it"이라고 말하면 노력이 부족하다는 것을 알 수 있습니다. 특히 대다수의 사람들이 Google 검색을 통해 여기에 온다는 점을 고려하면 더욱 그렇습니다. 나는 당신이 할 수있는 최소한의 공식 문서에 대한 링크를 추가하는 것 같아요. TBH, 삭제를 위해 플래그를 지정하지 않은 유일한 이유 는 질문 에 적어도 부분적으로 답변 했기 때문입니다 . 오래된 것이지만 자세한 내용을 제공하기 위해 편집하는 것을 고려하십시오.
Sean the Bean

15

도와 줄 이해 $#, $0그리고 $1, ..., $n나는이 스크립트를 사용합니까 :

#!/bin/bash

for ((i=0; i<=$#; i++)); do
  echo "parameter $i --> ${!i}"
done

이를 실행하면 대표 출력이 리턴됩니다.

$ ./myparams.sh "hello" "how are you" "i am fine"
parameter 0 --> myparams.sh
parameter 1 --> hello
parameter 2 --> how are you
parameter 3 --> i am fine

4
for 루프에서! i는 무엇을 의미합니까? 그것이 바로 내가 여기있는 이유이며, 무엇을 부를지 모르기 때문에 어디서든 답을 찾을 수 없습니다.
Anthony

7
@Anthony 이것을 변수 간접 이라고 합니다 . bash 에서 그의 사용법을 잘 설명 할 수 있습니다 : 간접 확장, 설명하십시오? .
fedorqui 'SO 중지 피해'10

3

몇 가지 예를 살펴보십시오. $ 0에는 프로그램 이름뿐만 아니라 일부 선행 경로가 포함될 수 있습니다. 예를 들어이 두 줄 스크립트를 ./mytry.sh로 저장하고 실행하십시오.

#!/bin/bash

echo "parameter 0 --> $0" ; exit 0

산출:

parameter 0 --> ./mytry.sh

이것은 Slackware 14.2를 통해 현재 (2016 년) Bash 버전입니다.


5
$ 0에 경로가 포함되는지 여부는 처음에 스크립트를 실행 한 방법에 따라 다릅니다. "./mytry.sh"를 실행하면 $ 0에 표시됩니다. "~ / mytry.sh"를 입력하면 쉘이 ~로 확장 되었기 때문에 전체 경로를 볼 수 있습니다. ". mytry.sh"를 수행하면 'bash'가 표시됩니다.
Steve Folly
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.