Shell Program(1) 변수, 상수

== 본 쉘 기반에서 프로그래밍 한 것임 (배쉬 쉘은 본쉘의 확장) ==

변수 : 쉘에서 변수를 선언할 때 그냥 변수명만 적어주면 된다. 즉, 데이터형을 명시하지

않아도 된다는 말이다.

name=TEST #단순 값일 경우 그대로 넣어주면된다. name변수에 TEST입력

#좌항과 우항사이의 '='에 공간이 있으면 않된다.

name="TEST Val" #공백이 포함되어 있으면 " "로 묶어준다.

name= #NULL로 초기화 된다.

변수 삭제 : 'unset' 키워드로 변수를 제거 할수 있다.

unset name #name 변수 제거

상수 : 만들어진 변수 앞에 "readonly" 키워드를 붙이면 된다.

name=TEST #name 변수 선언

readonly name #name 변수를 상수화

환경변수 : 쉘 스크립트 내에서 쉘 전체가 사용하는 환경변수도 사용 가능하다.

환경변수는 'set' 명령어로 명령어 리스트를 살펴볼수 있다.

export LANG=eng #LANG 환경 변수를 eng(영어)로 전환

cf) C쉘에서는 " setenv LANG=eng "

인자변수 : 쉘 스크립트 실행시 인자가 존재하면 그 인자를 저장하는 변수이다.

스크립트 파일 이후로 $1부터 자동으로 1씩 증가하면서 저장된다.

]#./test.sh arg1 arg2 #내부적으로 $1에는 arg1, $2에는 arg2가 저장됨

]#./test.sh -r * # $1에는 -r, $2에는 *

=> test.sh 파일에 ' rm $1 $2 '이 있으면 " rm -r * " 과 같이 실행된다.

특수변수 :

$# : 명령입력 라인에서 입력된 인자의 갯수가 저장된다.

$* : 명령입력 라인에서 입력된 인자 전체가 저장되어 있다.

$$ : 쉘 프로그램이 실행되면서 사용된 프로세서의 ID값을 가진다.

$! : 쉘 프로그램이 실행시킨 백그라운드 프로세스 ID값을 가진다.

$? : 최근 실행된 명령어의 리턴값을 저장하고 있다.

]#./test.sh -r *

=>$#는 '2', $*는 '-r *'가 저장되어있다.

=>$$는 위 프로세스의 ID가 저장되어 있다.

test.sh 파일에

" rm $1 $2 & "부분이 있으면

=>$!에 백그라운드로 실행된 rm의 ID가 저장된다.

ls 라는 명령어를 실행 후 정상적으로 종료되면 0이 리턴된다.

=>$?에는 0이 저장된다.

*위의 변수를 확인하려면 "echo $변수명"으로 확인하면 된다.

디폴트 변수 : 변수에 초기화가 되지 않았을 경우 사용하는데 문제가 발생할 지도 모른다. 그래서 쉘 프로그래밍에서 이 변수들을 처리하는 다양한 방식을 제공한다.

1. ${X:-Y} : X가 초기화 되지 않았으면 Y를 X 변수 대신에 사용한다. 그러나 X 대신

사용 할뿐 X에 Y값을 넣는것은 아니다.

var= #var를 선언했지만 초기화 하지 않았다.

cat ${var:-test.txt} #var에 값이 없으므로 var 대신 test.txt가 대입된다.

#(=cat test.txt)

2. ${X:=Y} : X가 초기화 되지 않았으면 Y를 X 변수 대신에 사용한다. 그리고 X 변수에

Y를 대입시킨다.

var= #var를 선언했지만 초기화 하지 않았다.

cat ${var:=test.txt} #var에 값이 없으므로 var에 test.txt가 대입된다.

#(=cat test.txt)

echo $var #var에 test.txt가 대입되었으므로 test.txt가 출력된다.

3. ${X:?에러메세지} : X가 초기화되지 않았으면 에러메세지를 출력하고 종료한다.

var= #var를 선언했지만 초기화 하지 않았다.

cat ${var:?error!!!} #var에 값이 없이 없으므로 에러메세지로 지정한 error!!!

#를 출력하고 "종료"한다.

echo "exit???" #위에서 종료 되었으므로 출력되지 않는다.

댓글

이 블로그의 인기 게시물

ubuntu에서 samba로 파일 공유하기

화이트해커를 위한 암호와 해킹