[ 리눅스 / 유닉스 / 셸 스크립트 프로그래밍 목차 ]
안녕하세요~ 저번 포스팅에서 리눅스 유닉스의 변수에 대한 전체 개념을 잡아봤었는데요 ㅎㅎ
변수들의 종류 중 위치 매개변수에 대해서 설명을 진행해보려고 합니다.
↓ 이전 포스팅
[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
$_ (달러 언더바) 사용법을 더 이해하고 싶으면, 아래 링크를 참조하세요 ~
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
플래그 정보에 대해 추가적으로 궁금하신 분은 아래 링크를 참조~!
해당 옵션들은 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
최신 댓글