진행 중인 bash 자습서 시리즈의 일부로 이전 기사에서 bash 위치 매개변수에 대해 논의했습니다. 이 기사에서는 실용적인 쉘 스크립트 예제가 거의 없는 bash 특수 매개변수에 대해 논의합니다.
이 기사에서 논의할 bash 특수 매개변수는 $*, $@, $#, $$, $!, $?, $-, $_
위치 매개변수의 전체 목록에 액세스하기 위해 두 개의 특수 매개변수 $* 및 $@를 사용할 수 있습니다. 큰따옴표를 제외하고 이 두 가지는 동일합니다. 둘 다 $1(공백으로 구분)로 시작하는 위치 매개변수 목록으로 확장됩니다.
그러나 큰따옴표 내에서는 다릅니다. 한 쌍의 큰따옴표 안에 있는 $*는 IFS "$1c$2c$3..."의 첫 번째 문자로 구분된 위치 매개변수 목록과 같습니다.
한 쌍의 큰따옴표 안에 있는 $@는 따옴표 없이 공백으로 구분된 위치 매개변수 목록과 동일합니다(예:"$1" "$2".."$N").
예시 1:Bash $* 및 $@를 사용하여 위치 매개변수 확장
이 예는 $* 및 $@에서 사용할 수 있는 값을 보여줍니다.
먼저 아래와 같이 expan.sh를 생성합니다.
<센터> 센터>$ cat expan.sh #!/bin/bash export IFS='-' cnt=1 # Printing the data available in $* echo "Values of \"\$*\":" for arg in "$*" do echo "Arg #$cnt= $arg" let "cnt+=1" done cnt=1 # Printing the data available in $@ echo "Values of \"\$@\":" for arg in "$@" do echo "Arg #$cnt= $arg" let "cnt+=1" done
다음으로 $*와 $@가 어떻게 동작하는지 보기 위해 아래와 같이 expan.sh를 실행합니다.
$ ./expan.sh "This is" 2 3 Values of "$*": Arg #1= This is-2-3 Values of "$@": Arg #1= This is Arg #2= 2 Arg #3= 3
- 위의 스크립트는 IFS(Internal Field Separator) 값을 '-'로 내보냈습니다.
- expan.sh $1=”This is”,$2=”2″ 및 $3=”3″ 스크립트에 전달된 세 개의 매개변수가 있습니다.
- 특수 매개변수 "$*"의 각 값을 인쇄할 때 IFS로 구분된 전체 위치 매개변수인 하나의 값만 제공합니다.
- "$@"는 각 매개변수를 별도의 단어로 제공합니다.
예시 2:$#를 사용하여 위치 매개변수 계산
$#는 bash의 특수 매개변수로 소수점 위치 매개변수의 수를 제공합니다.
먼저 아래와 같이 arithmetic.sh를 생성합니다.
$ cat arithmetic.sh #!/bin/bash if [ $# -lt 2 ] then echo "Usage: $0 arg1 arg2" exit fi echo -e "\$1=$1" echo -e "\$2=$2" let add=$1+$2 let sub=$1-$2 let mul=$1*$2 let div=$1/$2 echo -e "Addition=$add\nSubtraction=$sub\nMultiplication=$mul\nDivision=$div\n"
위치 매개변수의 수가 2보다 작으면 아래와 같이 사용 정보를 던집니다.
$ ./arithemetic.sh 10 Usage: ./arithemetic.sh arg1 arg2
예시 3:프로세스 관련 매개변수 – $$ 및 $!
특수 매개변수 $$는 쉘의 프로세스 ID를 제공합니다. $! 가장 최근에 실행된 백그라운드 프로세스의 프로세스 ID를 제공합니다.
다음 스크립트는 쉘의 프로세스 ID와 마지막 실행 백그라운드 프로세스 ID를 출력합니다.
$ cat proc.sh #!/bin/bash echo -e "Process ID=$$" sleep 1000 & echo -e "Background Process ID=$!"
이제 위의 스크립트를 실행하여 출력되는 프로세스 ID를 확인합니다.
$ ./proc.sh Process ID=9502 Background Process ID=9503 $ ps PID TTY TIME CMD 5970 pts/1 00:00:00 bash 9503 pts/1 00:00:00 sleep 9504 pts/1 00:00:00 ps $
예시 4:기타 Bash 특수 매개변수 – $?, $-, $_
- $? 가장 최근에 실행된 명령의 종료 상태를 제공합니다.
- $- set 내장 명령을 사용하여 설정한 옵션
- $_ 이전 명령에 마지막 인수를 제공합니다. 셸 시작 시 실행 중인 셸 스크립트의 절대 파일 이름을 제공합니다.
$ cat others.sh #!/bin/bash echo -e "$_"; ## Absolute name of the file which is being executed /usr/local/bin/dbhome # execute the command. #check the exit status of dbhome if [ "$?" -ne "0" ]; then echo "Sorry, Command execution failed !" fi echo -e "$-"; #Set options - hB echo -e $_ # Last argument of the previous command.
위 스크립트에서 마지막 echo 문 "echo -e $_"($ 밑줄)도 이전 명령의 마지막 인수 값인 hB를 출력합니다. 따라서 $_는 확장 후 값을 제공합니다.
$ ./others.sh ./others.sh /home/oracle Sorry, Command execution failed ! hB hB