본문 바로가기

별걸다하는 IT/리눅스 유닉스

[Linux/Unix/Shell programming] 위치 매개 변수, 특수매개변수, 아규먼트 변수 종류

[ 리눅스 / 유닉스 / 셸 스크립트 프로그래밍 목차 ]

 

안녕하세요~ 저번 포스팅에서 리눅스 유닉스의 변수에 대한 전체 개념을 잡아봤었는데요 ㅎㅎ

변수들의 종류 중 위치 매개변수에 대해서 설명을 진행해보려고 합니다.

 

↓ 이전 포스팅

 

[linux/unix/스크립트]셸 프로그래밍 기초 - 변수와 특수문자,빈 변수, 변수의 종류~ 변수총정리

[유닉스, 리눅스 셸 스크립트 프로그래밍 목차] 코딩을 항상 배우면 가장 먼저 배우게 되는 변수~~~ 오늘도 어김없이 찾아오는 변수편입니다. ㅎㅎ 변수란?! <--- 변수라는 단어가 뭘 의미하는지를 정리해놓은 완..

jhnyang.tistory.com

 

특수매개변수 (Special Parameters)

사실 어떤게 위치매개 변수냐 특수매개변수냐 뭐 이런 건 중요하지 않아요 ㅎㅎ

사용하기 편하게 미리 내장된 특수한 변수들이 있다는 정도만 알고 있으면 됩니당.

그리고 해당 코드들이 의미하는 게 무엇인지 알고 사용할 수 있으면 돼요 ㅎㅎ

사람들이 명칭하는 걸 보면, '위치매개변수와 특수매개변수가 딱 구분되어 있다!' 이렇다기보단 위와 같은 상관관계인듯?

 

특수 매개변수 대표적 사용 예시

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" 을 출력하라는 간단한 코드입니다 :) 

실행 결과

저는 해당 스크립트를 test라는 파일에다가 코드를 짜주었고, 실행을 "./test a b"이렇게 돌려봤는데, 아규먼트를 다시 채크하라는 메시지가 떴네요! 파일을 실행시킬때 넘겨준 아규먼트가 a, b 두 개로 3개가 아니기 때문에 해당 경고문이 잘 출력된 것을 확인할 수 있습니다.

 

아규먼트의 개수를 담고 있는 '$#'처럼 이와같이 내부적으로 수월한 사용을 위해 정의되어 있는 변수들을 특수변수라고 불러요~! 이런 특수매개변수의 종류들을 알아볼게요

 

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

종류

설명

$0

실행된 셸 스크립트명

$1

스크립트에 넘겨진 첫 번째 아규먼트 

$2

스크립트에 넘겨진 두 번째 아규먼트

$3 S4 등등...쭈욱 이후 $숫자

그 이후 해당되는 아규먼트 

$#

아규먼트 개수 

$*

스크립트에 전달된 인자 전체를 하나의 변수에 저장하면 IFS 변수의 첫 번째 문자로 구분

$@

$*와 동일한데 다른 점은 IFS 환경 변수를 사용하지 않는다는 점. 

여기 각 숫자들은 우리가 어떤 명령어를 쳤을 때, 띄어쓰기 기준으로 그 위치에 해당하는 값들을 가져옵니다.

그래서 $숫자 이런 형태를 위치매개변수라고 해요. 10번째부터는 "{}"로 감싸줘야 합니다. ${10}이렇게 ㅎㅎ

 

셸 스크립트를 짤 때, 함수에 넘겨준 매개변수 값을 사용할때도 쓰고

스크립트를 실행했을 때, 메인으로 넘겨주는 아규먼트 정보를 확인할 때에도 사용하는 등, 앞으로 자주자주 사용하게 될 녀석들이예요 ㅎㅎ

$0은 맨 처음 오는 명령어의 단어(?)를 저장하고 $1,$2,$3...등등 증가할수록 그 뒤에 오는 위치 순서에 따라서 변수가 저장되기에 위치매개변수라고 불러요 ㅎㅎ

꼭 위치가 아니더라도 $#, $*등을 포함해 아규먼트와 관련되어 있기 때문에 통틀어 아규먼트 변수라고 부르기도 합니다.

또 ... $var 이런 변수가 아니라 내장된 특수 변수이기 때문에 특수위치매개변수라고 부르기도 하고,

그냥 이런걸 통합해서 특수매개변수라고 부르기도 합니다. (부르기 나름~ $0가 뭐고 $#이 뭐고 어케 쓰는지만 알면 됌)

 

매개변수 값 확인해보기

echo '$0' value : $0 # 'echo \$0 value : $0' 으로 해도 결과는 같음 
echo '$1' value : $1 
echo '$2' value : $2 
echo '$3' value : $3 
echo '$#' value : $# 
echo '$*' value : $* 
echo '$@' value : $@

example.sh파일에 스크립트를 이렇게 작성하고 './example num1 num2 num3'를 실행하면 어떻게 될까요?

결과창

$*와 $0는 결과사진처럼 마치 동일한 것처럼 보여요 ㅎㅎ 쌍따옴표로 묶어주지 않으면 사실 동일한 기능을 수행합니다.

해당 매개변수의 차이점은 "$*와 $0 차이 포스팅"을 참고하세요!

 

특수매개변수

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

종류

설명

$!

실행을 위해 백그라운드로 보내진 마지막 프로그램 프로세스 번호 

$$

셸 스크립트의 PID

$?

실행한 뒤의 반환 값 (백그라운드로 실행된 것 제외)

$_

지난 명령의 마지막 인자로 설정된 특수 변수 

$-

현재 Shell이 호출될 때 사용한 옵션들

$$

보통 pid는 유일한 값이기 때문에, 유니크한 구분코드를 만들때 날짜시분초와 함께 명명규칙에 잘 포함되어 사용됩니다. 

uniq_id=$$`date +%Y%m%d%H%M%S` 
echo ${uniq_id}

 

$?

명령을 정상적으로 수행하면 0을 실패했다면 그 외의 값을 반환합니다.

$ ls 
$ echo $? 
0 
$ lss 
ksh: lss: not found 
$ echo $? 
127

ls는 현재 디렉터리의 파일, 디렉터리 목록들을 출력해줘요

if문 test 명령어 포스팅에서 결과값 확인을 위해 많이 사용된 명령코드가 바로 이 종료값을 반환해주는 매개변수였어요!

$!

백그라운드로 실행된 명령의 pid 예요

cat test.sh 
echo \$$ value: $$ 
echo \$! value: $!

단순히 $$와 $1값을 출력해주는 스크립트 test.sh를 만들었어요.

결과값

그냥 셸 스크립트만 실행했을 때에는 $! 값이 없습니다. 백그라운드에서 실행한게 아니라서 그래요 ㅎㅎ

대신 pid를 출력해주는 $$는 값이 나왔죠

 

백그라운드에서 실행되었을 때 제대로 $!가 나오는지 확인해볼게요.

참고로 프로그램 실행 시 끝에 &를 붙여 간단하게 명령을 백그라운드로 실행시킬 수 있습니다.

$ cat test.sh 
echo \$$ value: $$ #현재 셸 PID 
sleep 10           #백그라운드에서 10초동안 돌아가게 한당 
echo finish        #셸이 종료되었음을 알리기 위한 출력

스크립트는 위처럼 짜줬습니당.

백그라운드에서 돌리면, 프로세스 정보 1606이 뜨죵~ 아까 예제에서는 백그라운드에서 돌아가는 작업이 아니라서 $! 관련 정보가 뜨지 않았어요. 하지만 백그라운드로 셸 실행을 홀딩한 후, $!를 변수에 저장, 확인해보니까 프로세스 ID가 잘 나왔것을 볼 수 있어요. 해당 스크립트가 끝난 후(wait)에, $!를 수행해봐도 마지막으로 수행된 백그라운드 프로세스 ID '1606'을 출력하는 것을 알 수 있습니다.

$_

지난 명령의 마지막 인자로 전달된 값,

$ echo AA BB 
AA BB 
$ echo $_ 
BB

링크: https://www.adminschoice.com/bash-positional-parameters

$_ (달러 언더바) 사용법을 더 이해하고 싶으면, 아래 링크를 참조하세요 ~ 

 

Understand the meaning of `$_`

Could you explain the following sentences from Bash manual about $_, especially the parts in bold, maybe with some examples? At shell startup, set to the absolute pathname used to invoke the ...

unix.stackexchange.com

$-

어느 변수처럼 ${-}와 똑같음. 배시에 설정된 현재 플래그를 확인할 수 있습니다.

$ echo $-
himBH

 

플래그 정보에 대해 추가적으로 궁금하신 분은 아래 링크를 참조~!

링크:  https://www.adminschoice.com/bash-positional-parameters

해당 옵션들은 set명령어로 추가로 설정할 수도 있고 삭제할 수도 있어요 ㅎㅎ

 

Find out what your UNIX shell’s flags are & then change them

Today we enter the semi-arcane world of your UNIX shell’s flags, the variables that determine how your shell will function for you. I’m focusing on the bash shell, as that’s the one I know best. You can see your current flags by echoing the $- variable, as

www.chainsawonatireswing.com

기출문제

[리눅스마스터 1급 1602회]

다음 (괄호) 안에 들어갈 내용으로 알맞은 것은?

-------------------------------------------------------------------

[ihd@www ~]$ cat test.sh

#!bin/bash

echo "$0"

echo "$1"

[ihd@www ~]$ ./test.sh lin joon

(ㄱ)

(ㄴ)

-------------------------------------------------------------------

1. ㄱ. lin ㄴ. joon

2. ㄱ. joon ㄴ. lin

3. ㄱ. ./test.sh ㄴ. lin

4. ㄱ. ./test.sh ㄴ. joon

답: 3번

 

마무리

오늘 포스팅은 여기서 마무리하도록 할게요.

이런 특수매개변수가 실제 값으로 치환되는 것은, 명령 라인이 각 인수로 분리되기 전에 셸에 의해서 수행됩니다.

다음 포스팅에서는 확장매개변수 사용법을 진행하도록 하겠습니다 :)

모두 수고하셨어요

 

▼다음 포스팅

 

[리눅스 /유닉스 / 셸 스크립트] 매개변수 확장, 기타변수, 매개변수 치환 (Parameter substitution)

[Linux / Unix / Shell programming 완전 정복 목차] 안녕하세요~~ 오늘은 변수편에 이어서 변수들을 손쉽게 조작하고 확장시키는데 사용되는 '매개변수 확장'에 대해서 다뤄볼게요~ 혹 그전 포스팅을 보고오지 않..

jhnyang.tistory.com

 

  • 이성일 2020.07.20 16:32

    if [ s# - ne 3 ] -> 이분에서 s#은 하나의 특수 명령어라서 [ 와 붙허 있으면 안되더군요. if[ 도 안되고 if [ 해야지 문제 없이 동작 했습니다. ㅎ 한참 찾았어요

    • IT 양햄찌(jhnyang) 2020.07.20 23:19 신고

      정확히는 $#이 특수명령어라서라기보다 [ ] 대괄호 자체가 test 명령어를 의미하기 때문입니다. 명령어 사이끼리는 띄어쓰기가 원칙이라 대괄호 다음에는 반드시 띄어줘야해요. 리눅스 목차의 '조건문과 함께 쓰이는 test 명령어' 포스팅을 참조해주세요. 답변이 도움이 되었으면 좋겠네요 매번 방문 감사합니다 :)