셸 스크립트에서 자주 사용하는 내장 변수(Bash 내장 변수)

$FUNCNAME、$LINENO、$PWD

FUNCNAMELINENO 변수는 스크립트 디버깅에 자주 사용됩니다.FUNCNAME 현재 함수의 이름을 표시하고 작용 범위는 함수에서만 사용하며 함수 외에는 값이 없다LINENO 현재 스크립트에 변수가 나타나는 줄 번호를 나타냅니다.PWD 현재 디렉토리를 나타내며 pwd 명령에 해당합니다.
기존 스크립트a.sh는 다음과 같습니다.

#!/bin/bash

   testa()
  {
    echo 'func='$FUNCNAME,$LINENO
   }
  testa
 
  echo 'lineno:'$LINENO
  echo 'xx:'$FUNCNAME
  echo 'curpath:'$PWD
./a.sh 명령을 실행하고 다음과 같이 출력합니다.
[tt@ecs-centos-7 ~]$ ./a.sh
func=testa,6
lineno:12
xx:
curpath:/home/tttesta 함수에서 FUNCNAME 변수 값은 testa, 즉 함수 이름으로 함수 외부에 값이 없다LINENO 변수는 함수에서든 함수 밖에서든 현재 있는 줄 번호를 나타낸다

$$、$PPID


이 두 변수는 현재 프로세스 ID와 상위 프로세스 ID를 나타냅니다.
현재 a.sh 스크립트는 다음과 같습니다.sleep 20 수면 문장은 실행 스크립트 프로세스의 종료를 잠시 늦추기 위해 다른 터미널에서 출력을 검증한 결과입니다

#!/bin/bash
#set -u

echo 'cur pid:'$$
echo 'parent pid:'$PPID
sleep 20
현재 터미널에서 실행./a.sh 결과는 다음과 같습니다.

[tt@ecs-centos-7 ~]$ ./a.sh 
cur pid:13095
parent pid:12982
실행a.sh의 스크립트 프로세스가 종료되기 전에 다른 터미널을 열고 ps -o pid,ppid,time,cmd -p 12982,13095 명령을 실행합니다. 결과는 다음과 같습니다.

[tt@ecs-centos-7 ~]$ ps -o pid,ppid,time,cmd -p 12982,13095
  PID  PPID     TIME CMD
12982 12981 00:00:00 -bash
13095 12982 00:00:00 /bin/bash ./a.sh
위의 결과를 보면 ./a.sh 명령을 실행한 후 $$변수는 실행a.sh 스크립트의 프로세스 ID 13095를 나타내고, 12982는 부모 프로세스 ID, 즉 PPID 변수의 값을 나타냅니다. 이것은 현재 bash의 실례입니다.

$0,$1,$2...$n、$#

$# 명령줄에서 스크립트로 전송되는 매개 변수 수를 나타냅니다.$0,$1,$2...$n 명령줄에서 스크립트로 전달되는 매개 변수$0는 스크립트 자체의 이름이다$1 첫 번째 매개변수입니다.$2 는 두 번째 매개 변수입니다.$n n번째 매개변수입니다.
열 번째 매개 변수와 이후의 매개 변수는 반드시 대괄호로 묶어야 한다. 예를 들어 ${10}, ${11}, ${12}는 순서대로 열 번째 변수, 열 번째 변수, 열두 번째 변수를 표시해야 한다.

$*、$@


모두 위치 매개 변수를 표시하지만, 그것들 사이에도 약간의 차이점이 있다$* 를 사용할 때 따옴표, 즉 $* 형식을 더하면 모든 위치의 매개 변수는 하나의 단어로 처리되고, 따옴표, 즉 $* 형식이 포함되지 않으면 각 위치의 매개 변수는 하나의 독립된 단어로 처리됩니다.$@에 대해 인용부호를 붙이든 안 붙이든 각 위치의 매개 변수는 하나의 독립된 단어로 처리된다
현재 c.sh, 내용은 다음과 같다.

#!/bin/bash

cnt=1
echo 'test 1111'

for var in "$*"
do
   echo "arg$cnt="$var
   let "cnt+=1"
done
echo

cnt=1
echo 'test 2222'
for var in $*
do
  echo "arg$cnt="$var
  let "cnt+=1"
done
echo

cnt=1
echo 'test 3333'
for var in "$@"
do
  echo "arg$cnt="$var
  let "cnt+=1"
done
echo

cnt=1
echo "test 4444"
for var in $@
do
 echo "arg$cnt="$var
 let "cnt+=1"
done
실행./c.sh 1 2 3, 결과는 다음과 같다.
[root@ecs-centos-7 ~]# ./c.sh 1 2 3
test 1111
arg1=1 2 3
test 2222
arg1=1
arg2=2
arg3=3
test 3333
arg1=1
arg2=2
arg3=3
test 4444
arg1=1
arg2=2
arg3=3
위의 결과에서 알 수 있듯이 $*의 경우 큰따옴표를 추가하면 모든 위치 매개 변수가 하나의 단어로 간주된다
$@ 의 경우 큰따옴표를 두 번 붙였는지 여부는 결과가 동일합니다.
따라서 큰따옴표를 사용할 때만 $* 및 $@ 차이가 발생합니다.

$?


명령, 함수 또는 스크립트의 종료 상태는 명령의 실행 결과나 함수의 호출 결과를 판단할 때 유용하다
기존 e.shf.sh 테스트 스크립트
e.sh 스크립트

#!/bin/bash

test_func()
{
  if [[ $1 -eq 10 ]]; then
        return 5
  fi
  return 6
}


if [ $# -ge 1 ]; then
   name="$1"
   shift 1
   $name "$@"
fi
f.sh 스크립트

#!/bin/bash


sh e.sh test_func 3
echo 'exit code1:'$?

sh e.sh test_func 10
echo 'exit code2:'$?

test -f $PWD/xx.txt
echo 'exit code3:'$?

test -f $PWD/e.sh
echo 'exit code4:'$?
./f.sh 명령을 실행한 결과 다음과 같습니다.
[root@ecs-centos-7 ~]# ./f.sh
exit code1:6
exit code2:5
exit code3:1
exit code4:0
스크립트e.sh에서 test_func 함수 기능은 매개 변수가 10이면 종료 상태가 5이고 그렇지 않으면 6이다.sh e.sh test_func 3 명령은 e.sh 스크립트의 test_func 함수를 호출합니다. 전송 매개 변수는 3이기 때문에 종료 상태는 6입니다. 이치상 알 수 있듯이 sh e.sh test_func 10 명령의 종료 상태는 5입니다.
Linux에서 명령이 성공적으로 실행되었습니다. 종료 상태는 0이고 실패는 0이 아닙니다.test -f $PWD/xx.txt 명령은 현재 디렉토리xx.txt 파일이 있는지 확인하는 것입니다. 현재 디렉토리xx.txt가 존재하지 않기 때문에 명령 실행에 실패했습니다. 종료 상태는 0이 아닙니다.e.sh 현재 디렉터리에 존재하기 때문에 test -f $PWD/e.sh 명령이 성공적으로 실행되었고 종료 상태는 0입니다

$IFS


이 변수는 Bash에서 문자열이나 단어 경계를 식별하는 데 사용되며, 기본값은 공백이며, 스크립트에서 필요에 따라 이 변수의 값을 수정할 수 있습니다
현재 b.sh 스크립트는 다음과 같습니다.

#!/bin/bash

va="a:b:c"
vb="x-y-z"
vc="e,f,g"

IFS=":"
echo 'va:'$va
echo 'vb:'$vb
echo 'vc:'$vc

echo

IFS="-"
echo 'va:'$va
echo 'vb:'$vb
echo 'vc:'$vc

echo

IFS=","
echo 'va:'$va
echo 'vb:'$vb
echo 'vc:'$vc
실행./b.sh 결과는 다음과 같습니다.
[tt@ecs-centos-7 ~]$ ./b.sh
va:a b c
vb:x-y-z
vc:e,f,g
va:a:b:c
vb:x y z
vc:e,f,g
va:a:b:c
vb:x-y-z
vc:e f g
결과에서 알 수 있듯이 $IFS:일 때 문자열"a:b:c"a b c로 해석되었다$IFS-인 경우 문자열"x-y-z"x y z로 해석됩니다.$IFS,인 경우 문자열"e,f,g"e f g로 해석됩니다.
$HOME、$USER、$UID、$GROUPS

HOME:    home 
USER:    
UID:     ID
GROUPS:  ID

[tt@ecs-centos-7 ~]$ echo $HOME
/home/tt
[tt@ecs-centos-7 ~]$ echo $USER
tt
[tt@ecs-centos-7 ~]$ echo $UID
1003
[tt@ecs-centos-7 ~]$ echo $GROUPS
1003

$HOSTTYPE、$MACTYPE、$OSTYPE


이 변수들은 모두 시스템 하드웨어를 나타낸다

[tt@ecs-centos-7 ~]$ echo $HOSTTYPE
x86_64
[tt@ecs-centos-7 ~]$ echo $MACHTYPE
x86_64-redhat-linux-gnu
[tt@ecs-centos-7 ~]$ echo $OSTYPE
linux-gnu

작은 매듭


본고는 자주 사용하는 Bash 내장 변수를 소개하였으며, 일부 생소하거나 평소에 거의 사용하지 않는 변수에 대해서는 관련 자료를 스스로 찾아볼 수 있다
이상은 셸 스크립트에서 자주 사용하는 내장 변수 (Bash 내장 변수) 의 상세한 내용입니다. 셸 내장 변수에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기