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???" #위에서 종료 되었으므로 출력되지 않는다.
댓글