HomeAbout
[BASH] 명령줄 인수와 특수 매개변수 (bash Special Parameters)
Algorithm & CS & OS
[BASH] 명령줄 인수와 특수 매개변수 (bash Special Parameters)
NASA1515
NASA1515
July 05, 2021
1 min

목차

01
✔ 특수 매개변수
02
✌ 아규먼트 변수 , 위치매개변수

✔ 특수 매개변수

  • 특수매개변수 (Special Parameters)
  • 매개변수를 설명하기 전 알고가야 할 사항은 위치매개 변수인지, 특수매개 변수인지 사실 별로 중요하지 않습니다.
    그저 미리 내장된 특수한 변수들이 있고, 해당 코드들이 무슨 의미인지만 알면 됩니다.

매개변수들의 상관관계

스크린샷, 2020-08-19 15-35-50


특수 매개 변수 사용 예

  • 간단하게 스크립트를 하나 짜봤습니다.

#!/bin/bash
if [ $# -ne 3 ] 
    then echo "plz check arguments again" 
else 
    echo "$0 script is running" 
fi

코드에 보이는 '$#''$0'와 같이 달러 표시로 시작되는 것들이 내부적으로 지정되어 있는 변수입니다.

  • '$#'은 넘겨진 아규먼트 개수
  • '$0'은 실행된 셸 스크립트명을 의미해요

스크립트의 내용은 넘겨진 아규먼트의 개수가 3개가 아니라면 "plz check arguments again"을 출력하고
3개가 맞다면 "00 script is running" 을 출력하라는 간단한 코드입니다 :)


  • 스크립트를 실행시켜봅시다

student@nasa1515:/home/won/script$ ./nasa.sh a b          ### 아규먼트 갯수를 2개로 지정
plz check arguments again
student@nasa1515:/home/won/script$ 
student@nasa1515:/home/won/script$ ./nasa.sh a b c        ### 아규먼트 갯수를 3개로 지정
./nasa.sh script is running

위와 같이 아규먼트의 개수를 담고 있는 '$#'처럼 편의성을 위해 정의되어 있는 변수들을 특수변수라고 합니다.


✌ 아규먼트 변수 , 위치매개변수


  • 변수들의 종류

    스크린샷, 2020-08-19 15-47-49

    이전 포스트인 정규표현식과 동일합니다.
    각 숫자들은 우리가 어떤 명령을 내릴 때, 띄어쓰기 기준으로 그 위치에 해당하는 값들을 가져옵니다.

    그래서 $숫자 형태를 위치매개변수라고 합니다.
    추가적인 팁으로 10번째부터는 ”{}“로 감싸줘야 합니다. ex) ${10}

    스크린샷, 2020-08-19 15-50-40


매개변수 값 확인

  • 실습을 위해서 아래와 같이 스크립트를 작성했습니다.
#!/bin/bash
echo '$0' value : $0
echo '$1' value : $1
echo '$2' value : $2
echo '$3' value : $3
echo '$#' value : $#
echo '$*' value : $*
echo '$@' value : $@

  • 스크립트를 실행해보겠습니다.
student@nasa1515:/home/won/script$ ./nasa1515.sh int1 int2 int3
$0 value : ./nasa1515.sh
$1 value : int1
$2 value : int2
$3 value : int3
$# value : 3
$* value : int1 int2 int3
$@ value : int1 int2 int3

$*$0는 결과처럼 동일한 것처럼 보입니다. 보통 쌍따옴표로 묶어주지 않으면 동일한 기능을 수행합니다.


  • 간단하게 두 변수 모두 쌍따옴표로 묶어서 테스트 해볼까요?
# 아래와 같이 간단한 스크립트를 하나 만들었습니다.
#!/bin/bash

echo '1."$@"GO---------------------------------------'
for i in "$@"
do
echo $i
done

echo ""

echo '2."$*"GO---------------------------------------'
for i in "$*"
do
echo $i
done

  • 쌍따옴표로 묶은 결과는 다음과 같습니다.
student@nasa1515:/home/won/script$ ./test.sh aaa bbb ccc ddd fff
1."$@"GO---------------------------------------
aaa
bbb
ccc
ddd
fff

2."$*"GO---------------------------------------
aaa bbb ccc ddd fff

결과로 보이듯이 "" ""로 변수가 묶인 경우 저장되어있는 개개의 값이 전개되는 것이 다릅니다.
더 쉽게 예를들어 받는 값이 "aaa" "bbb" "ccc"(※ set “aaa” “bbb” “ccc”) 일 때

  • ”$@”

    "aaa" "bbb" "ccc" 처럼 전개됩니다.

  • ”$*”

    "aaa bbb ccc" 처럼 전개됩니다.


특수매개변수

특수매개변수가 꼭 아규먼트와 관련된 변수만 있는 것은 아닙니다.
아규먼트 변수 외에도 아래와 같은 다양한 정보를 알 수 있는 변수들이 있습니다

스크린샷, 2020-08-19 16-23-10

  • $$

    보통 pid는 유일한 값이기 때문에 유니크한 구분코드를 만들때 날짜시분초와 함께 명명규칙에 잘 포함되어 사용됩니다.
uniq_id=$$`date +%Y%m%d%H%M%S` 
echo ${uniq_id}
student@nasa1515:/home/won/script$ uniq_id=$$`date +%Y%m%d%H%M%S`
student@nasa1515:/home/won/script$ echo ${uniq_id}
395820200819162509
student@nasa1515:/home/won/script$ echo $$
3958

  • $?

    명령을 정상적으로 수행하면 0을 실패했다면 그 외의 값을 반환합니다.
student@nasa1515:/home/won/script$ echo "test"
test
student@nasa1515:/home/won/script$ echo $?
0
student@nasa1515:/home/won/script$ 
student@nasa1515:/home/won/script$ llls
llls: 명령을 찾을 수 없습니다
student@nasa1515:/home/won/script$ echo $?
127

보통 if문의 결과값을 확인하기위해 많이 사용됩니다.


  • $!

    백그라운드로 실행된 명령의 pid 입니다

  • 실습을 위해 아래같은 스크립트를 하나 만들었습니다.

#!/bin/bash
echo value: $$
sleep 10
echo finish
student@nasa1515:/home/won/script$ ./aa.sh &
[1] 9007
student@nasa1515:/home/won/script$ value: 9007
finish

[1]+  완료                  ./aa.sh

다음과 같이 정상적으로 백그라운드로 실행된 PID를 출력합니다

이후에 다시 $!을 출력해보더라도 동일한 PID 출력됩니다.

student@nasa1515:/home/won/script$ echo $!
9007

  • $_

    지난 명령의 마지막 인자로 전달된 값 출력
$ echo AA BB 
AA BB 
$ echo $_ 
BB

Tags

#Linux
NASA1515

NASA1515

Data Engineer

Hello I'M Wonseok aka NASA1515

Expertise

Public Cloud
k8s/Docker
Python

Social Media

instagramwebsitelinkedingithub

Related Posts

[LINUX] 효율적인 리눅스 로그 관리: SYSLOGD와 RSYSLOG
[LINUX] 효율적인 리눅스 로그 관리: SYSLOGD와 RSYSLOG
2021-07-09
2 min

Topics

CloudDevelop

Social Media