수색…


소개

Bash 내부 변수의 개요, 사용 방법, 사용 방법 및시기

Bash 내부 변수 한 눈에보기

변하기 쉬운 세부
$* / $@ 기능 / 스크립트 위치 매개 변수 (인수). 다음과 같이 펼치십시오.

$*$@$1 $2 ... 와 같습니다 $1 $2 ... (일반적으로 인용 부호가 붙지 않은 채로 두는 것은 의미가 없습니다)
"$*""$1 $2 ..." 1
"$@""$1" "$2" ...
1. 인수는 $ IFS의 첫 문자로 구분되며 공백이 아니어도됩니다.
$# 스크립트 또는 함수에 전달 된 위치 매개 변수의 수
$! 백그라운드에 놓인 가장 최근 작업의 마지막 (파이프 라인 용 가장) 명령의 프로세스 ID (작업 제어가 사용 가능할 때 작업의 프로세스 그룹 ID와 반드시 동일하지는 않음에 유의하십시오)
$$ bash 를 실행 한 프로세스의 ID
$? 마지막 명령의 종료 상태
$n 위치 매개 변수, 여기서 n = 1, 2, 3, ..., 9
${n} 위치 매개 변수 (위와 동일), n은 9보다 클 수 있습니다.
$0 스크립트에서 스크립트가 호출 된 경로. bash -c 'printf "%s\n" "$0"' name args' : name (인라인 스크립트 뒤의 첫 번째 인수). 그렇지 않으면 bash 받은 argv[0] .
$_ 마지막 명령의 마지막 필드
$IFS 내부 필드 분리 기호
$PATH 실행 파일을 찾는 데 사용되는 PATH 환경 변수
$OLDPWD 이전 작업 디렉토리
$PWD 현재 작업 디렉토리
$FUNCNAME 실행 호출 스택의 함수 이름 배열
$BASH_SOURCE FUNCNAME 배열의 요소에 대한 소스 경로를 포함하는 배열입니다. 스크립트 경로를 가져 오는 데 사용할 수 있습니다.
$BASH_ALIASES 현재 정의 된 모든 별칭을 포함하는 연관 배열
$BASH_REMATCH 마지막 정규식 일치 항목의 배열
$BASH_VERSION 배쉬 버전 문자열
$BASH_VERSINFO Bash 버전 정보가있는 6 개의 요소로 구성된 배열
$BASH 현재 실행중인 Bash 셸 자체의 절대 경로 ( argv[0]$PATH 의 값을 기반으로하는 bash 에 의해 경험적으로 결정됨)은 구석의 경우 잘못되었을 수 있습니다.
$BASH_SUBSHELL Bash 서브 쉘 레벨
$UID 실수 (다른 경우 유효하지 않음) bash 실행하는 프로세스의 사용자 ID
$PS1 기본 명령 줄 프롬프트; PS * 변수 사용을 참조하십시오.
$PS2 보조 명령 행 프롬프트 (추가 입력 용)
$PS3 3 차 명령 행 프롬프트 (선택 루프에서 사용됨)
$PS4 4 차 명령 행 프롬프트 (정보 출력에 세부 정보를 추가하는 데 사용)
$RANDOM 0 ~ 32767 사이의 의사 랜덤 정수
$REPLY 변수가 지정되지 않은 경우 기본적으로 read 에 사용되는 변수입니다. 또한 사용자 select 값을 반환하기 위해 select 에 의해 사용됩니다.
$PIPESTATUS 가장 최근에 실행 된 전경 파이프 라인에서 각 명령의 종료 상태 값을 보유하는 배열 변수입니다.

변수 할당은 전후에 공백이 없어야합니다. a=123 not a = 123 . 후자 (공백으로 둘러싸인 등호)는 분리 식으로 =123 인수를 사용하여 명령 a 를 실행하지만 문자열 비교 연산자에서도 볼 수 있습니다 (구문 론적으로 [ 또는 [[ 사용).

$ BASHPID

Bash의 현재 인스턴스의 프로세스 ID (PID). 이것은 $$ 변수와 같지 않지만 종종 동일한 결과를 제공합니다. 이것은 Bash 4에서 새로 추가되었으며 Bash 3에서는 작동하지 않습니다.

~> $ echo "\$\$ pid = $$  BASHPID = $BASHPID"
$$ pid = 9265  BASHPID = 9265

$ BASH_ENV

스크립트가 호출 될 때 읽히는 Bash 시작 파일을 가리키는 환경 변수.

$ BASH_VERSINFO

주요 버전을 찾고있는 경우 $BASH_VERSION 보다 훨씬 편리한 요소로 분할 된 전체 버전 정보를 포함하는 배열입니다.

~> $ for ((i=0; i<=5; i++)); do echo "BASH_VERSINFO[$i] = ${BASH_VERSINFO[$i]}"; done
BASH_VERSINFO[0] = 3
BASH_VERSINFO[1] = 2
BASH_VERSINFO[2] = 25
BASH_VERSINFO[3] = 1
BASH_VERSINFO[4] = release
BASH_VERSINFO[5] = x86_64-redhat-linux-gnu

$ BASH_VERSION

실행중인 bash의 버전을 표시합니다. 이렇게하면 고급 기능을 사용할 수 있는지 여부를 결정할 수 있습니다.

~> $ echo $BASH_VERSION
4.1.2(1)-release

$ EDITOR

모든 스크립트 나 프로그램 (보통 vi 또는 emacs)에 의해 영향을받는 기본 편집기.

~> $ echo $EDITOR
vi

$ FUNCNAME

현재 함수의 이름을 얻으려면 다음을 입력하십시오.

my_function()
{
    echo "This function is $FUNCNAME"    # This will output "This function is my_function"
}

이 명령은 함수 외부에 입력하면 아무 것도 반환하지 않습니다.

my_function

echo "This function is $FUNCNAME"    # This will output "This function is"

$ HOME

사용자의 홈 디렉토리

~> $ echo $HOME
/home/user

$ HOSTNAME

시작할 때 시스템에 할당 된 호스트 이름.

~> $ echo $HOSTNAME
mybox.mydomain.com

$ HOSTTYPE

이 변수는 하드웨어를 식별하므로 실행할 바이너리를 결정할 때 유용 할 수 있습니다.

~> $ echo $HOSTTYPE
x86_64

$ 그룹

사용자가있는 그룹 수를 포함하는 배열입니다.

#!/usr/bin/env bash
echo You are assigned to the following groups:
for group in ${GROUPS[@]}; do
   IFS=: read -r name dummy number members < <(getent group $group )
   printf "name: %-10s number: %-15s members: %s\n" "$name" "$number" "$members" 
done

$ IFS

반복 할 때 bash가 문자열을 분할하는 데 사용하는 내부 필드 분리 자 문자열을 포함합니다. 기본값은 \n (줄 바꿈), \t (탭) 및 공백입니다. 이것을 다른 것으로 변경하면 다른 문자를 사용하여 문자열을 분할 할 수 있습니다.

IFS=","
INPUTSTR="a,b,c,d"
for field in ${INPUTSTR}; do
    echo $field
done 

위의 출력은 다음과 같습니다.

a
b
c
d

노트:

$ LINENO

현재 스크립트의 행 번호를 출력합니다. 스크립트를 디버깅 할 때 주로 유용합니다.

#!/bin/bash
# this is line 2
echo something  # this is line 3
echo $LINENO # Will output 4

$ MACHTYPE

위의 $HOSTTYPE 유사하게, 여기에는 하드웨어 및 OS에 대한 정보도 포함됩니다

~> $ echo $MACHTYPE
x86_64-redhat-linux-gnu

$ OLDPWD

OLDPWD (OLDP RINT의 W의 orking의 D의 irectory)은 최종 전에 디렉토리 포함 cd 명령을 :

~> $ cd directory
directory> $ echo $OLDPWD
/home/user

$ OSTYPE

기기에서 실행중인 OS 유형에 대한 정보를 반환합니다 (예 :

~> $ echo $OSTYPE
linux-gnu

$ PATH

명령의 바이너리를 찾는 검색 경로. 일반적인 예는 /usr/bin/usr/local/bin 입니다.

사용자 또는 스크립트가 명령을 실행하려고하면 실행 권한이있는 일치하는 파일을 찾기 위해 $PATH 가 검색됩니다.

$PATH 의 디렉토리는 : 문자로 구분됩니다.

~> $ echo "$PATH"
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin

예를 들어 위의 $PATH 주어지면 프롬프트에서 lss 를 입력하면 쉘은 /usr/kerberos/bin/lss 를 찾은 다음 /usr/local/bin/lss 를 찾은 다음 /bin/lss 를 찾은 다음 /usr/bin/lss 를 순서대로 나열한 후 해당 명령이 없다고 판 단합니다.

$ PPID

스크립트 또는 쉘의 부모 프로세스 ID (pid). 즉 현재 스크립트 또는 쉘을 호출 한 프로세스를 의미합니다.

~> $ echo $$
13016
~> $ echo $PPID
13015

$ PWD

PWD ( P rint W orking D 디렉토리) 현재 작업중인 디렉토리 :

~> $ echo $PWD
/home/user
~> $ cd directory
directory> $ echo $PWD
/home/user/directory

$ SECONDS

스크립트가 실행 된 시간 (초)입니다. 쉘에 표시되면 상당히 커질 수 있습니다.

~> $ echo $SECONDS
98834

$ SHELLOPTS

bash 옵션의 읽기 전용 목록은 시작시 작동 방식을 제어하기 위해 제공됩니다.

~> $ echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

$ SHLVL

bash 명령이 실행되면 새 쉘이 열립니다. $ SHLVL 환경 변수는 현재 쉘이 실행중인 쉘 레벨 수를 보유합니다.

터미널 창에서 다음 명령을 실행하면 사용중인 Linux 배포본에 따라 다른 결과가 생성됩니다.

echo $SHLVL

Fedora 25를 사용하면 출력은 "3"입니다. 이것은 새 쉘을 열 때 초기 bash 명령이 실행되어 태스크를 수행한다는 것을 나타냅니다. 초기 bash 명령은 하위 프로세스 (다른 bash 명령)를 실행하고, 최종 bash 명령을 실행하여 새 쉘을 엽니 다. 새 셸이 열리면 2 개의 다른 셸 프로세스의 자식 프로세스로 실행되므로 "3"이 출력됩니다.

다음 예에서 (사용자가 Fedora 25를 실행하는 경우) 새 쉘에서 $ SHLVL의 출력이 "3"으로 설정됩니다. 각 bash 명령이 실행될 때마다 $ SHLVL이 1 씩 증가합니다.

~> $ echo $SHLVL
3
~> $ bash
~> $ echo $SHLVL
4
~> $ bash
~> $ echo $SHLVL
5

'bash'명령을 실행 (또는 bash 스크립트를 실행)하면 새로운 쉘이 열리는 것을 볼 수 있습니다. 비교해 보면, 스크립트를 소싱하면 현재 쉘에서 코드가 실행됩니다.

test1.sh

#!/usr/bin/env bash
echo "Hello from test1.sh. My shell level is $SHLVL"
source "test2.sh"

test2.sh

#!/usr/bin/env bash
echo "Hello from test2.sh. My shell level is $SHLVL"

run.sh

#!/usr/bin/env bash
echo "Hello from run.sh. My shell level is $SHLVL"
./test1.sh

실행 :

chmod +x test1.sh && chmod +x run.sh
./run.sh

산출:

Hello from run.sh. My shell level is 4
Hello from test1.sh. My shell level is 5
Hello from test2.sh. My shell level is 5

$ UID

사용자의 ID 번호를 저장하는 읽기 전용 변수 :

~> $ echo $UID
12345

$ 1 $ 2 $ 3 등 ...

명령 줄 또는 함수에서 스크립트에 전달 된 위치 매개 변수 :

#!/bin/bash
# $n is the n'th positional parameter
echo "$1"
echo "$2"
echo "$3"

위의 출력은 다음과 같습니다.

~> $ ./testscript.sh firstarg secondarg thirdarg
firstarg
secondarg
thirdarg

위치 인수의 수가 9보다 큰 경우에는 중괄호를 사용해야합니다.

#  "set -- " sets positional parameters
set -- 1 2 3 4 5 6 7 8 nine ten eleven twelve
# the following line will output 10 not 1 as the value of $1 the digit 1
# will be concatenated with the following 0
echo $10   # outputs 1
echo ${10} # outputs ten
# to show this clearly:
set -- arg{1..12}
echo $10 
echo ${10}

$ #

명령 행 인수 또는 위치 매개 변수의 수를 얻으려면 다음을 입력하십시오.

#!/bin/bash
echo "$#"

세 개의 인수를 사용하여 실행하면 위의 예가 출력됩니다.

~> $ ./testscript.sh firstarg secondarg thirdarg
3

$ *

모든 단일 매개 변수를 단일 문자열로 반환합니다.

testscript.sh :

#!/bin/bash
echo "$*"

여러 개의 인수를 사용하여 스크립트를 실행하십시오.

./testscript.sh firstarg secondarg thirdarg 

산출:

firstarg secondarg thirdarg

$!

백그라운드에서 마지막으로 실행 된 작업의 프로세스 ID (pid)

~> $ ls &
testfile1 testfile2
[1]+  Done                    ls
~> $ echo $!
21715

$ _

실행 된 마지막 명령의 마지막 필드를 출력하여 다른 명령으로 전달할 항목을 얻는 데 유용합니다.

 ~> $ ls *.sh;echo $_
testscript1.sh  testscript2.sh
testscript2.sh

다음 명령을 사용하기 전에 스크립트 경로를 제공합니다.

test.sh :

#!/bin/bash
echo "$_"

산출:

~> $ ./test.sh # running test.sh
./test.sh

참고 : 이것은 스크립트 경로를 얻는 간단한 방법은 아닙니다.

$?

마지막으로 실행 된 기능 또는 명령의 종료 상태. 보통 0은 확인을 의미합니다. 다른 것은 실패를 나타냅니다.

~> $ ls *.blah;echo $?
ls: cannot access *.blah: No such file or directory
2
~> $ ls;echo $?
testfile1 testfile2
0

$$

현재 프로세스의 프로세스 ID (pid) :

~> $ echo $$
13246

$ @

"$@" 는 모든 명령 행 인수를 별도의 단어로 확장합니다. 모든 인수를 단일 단어로 확장하는 "$*" 과 다릅니다.

"$@" 는 인수를 반복 하고 공백으로 인수를 처리하는 데 특히 유용합니다.

우리가 다음과 같은 두 가지 인자로 호출 한 스크립트에 있다고 가정 해보십시오.

$ ./script.sh "␣1␣2␣" "␣3␣␣4␣"

변수 $* 또는 $@$1␣$2 로 확장되며, 차례로 1␣2␣3␣4 로 확장되므로 아래 루프가됩니다.

for var in $*; do # same for var in $@; do
    echo \<"$var"\>
done

둘 다 인쇄 할 것이다.

<1>
<2>
<3>
<4>

"$*""$1␣$2" 로 확장되며 "␣1␣2␣␣␣3␣␣4␣" 로 확장되어 루프가됩니다.

for var in "$*"; do
    echo \<"$var"\>   
done

echo 한 번만 호출하고 인쇄 할 것입니다.

<␣1␣2␣␣␣3␣␣4␣>

마지막으로 "$@""$1" "$2" 로 확장되며 "␣1␣2␣" "␣3␣␣4␣" 로 확장되므로 루프

for var in "$@"; do
    echo \<"$var"\>
done

인쇄 할 것이다.

<␣1␣2␣>
<␣3␣␣4␣>

인수의 내부 간격과 인수 분리를 보존합니다. for var in "$@"; do ... 대한 생성 for var in "$@"; do ... 는 매우 일반적이며 관용적이어서 for 루프의 기본값 for var; do ... 로 단축 될 수 있습니다 for var; do ...

$ HISTSIZE

기억 된 명령의 최대 수 :

~> $ echo $HISTSIZE
1000

$ RANDOM

이 매개 변수가 참조 될 때마다 0에서 32767 사이의 임의의 정수가 생성됩니다. 이 변수에 값을 할당하면 난수 생성기 ( 소스 )가 시드됩니다.

~> $ echo $RANDOM 
27119
~> $ echo $RANDOM 
1349


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow