셸 스크립트에서 자주 사용하는 내장 변수(Bash 내장 변수)
$FUNCNAME、$LINENO、$PWD
FUNCNAME
및 LINENO
변수는 스크립트 디버깅에 자주 사용됩니다.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/tt
testa
함수에서 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.sh
및 f.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 내장 변수) 의 상세한 내용입니다. 셸 내장 변수에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ZSH에서 물고기까지ZSH는 수년 동안 내 기본 셸이었습니다. 이제 몇 달 동안 사용하면서 ZSH 구성에 대해 몇 가지 사항을 발견했습니다. 우리는 을 제공하는 시스템과 더 빨리 상호 작용하는 경향이 있습니다. 내.zshrc 구성에는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.