[Shell Script] 8. Branching
이번 포스팅은 따배님의 Shell Script 제 8강 Branching을 보고 내용을 정리해보도록 하겠다.
영상 링크 첨부한다.
명강의니 반드시 들어보자.
목차:
- exit
- test
- if-then
- case
1. exit
exit는 실행된 프로그램이 종료된 상태를 전달해준다. exit 값을 확인할 수 있는 명령어는 $? 이다.
숫자별로 뜻이 있다.
0 -> 프로그램 또는 명령이 성공으로 종료되었다.
1 -> 일반적인 에러가 일어나 실패로 종료되었다.
2 -> syntax error로 실패로 종료되었다.
126 -> 명령을 실행할 수 없어서 실패로 종료되었다.
127 -> 파일이 존재하지 않아서 실패로 종료되었다.
128 + N -> 종료 시그널 + N (kill -9 PID로 종료시 128+9=137) 즉 137이 나오면 kill -9로 종료했다는 뜻이다.
백문이 불여일견, 예시를 보자
date라는 기본적인 명령어이다. 이것에 대한 exit값($?)을 보면 0으로 나온다. 이는 date가 실행후 종료되었을 때 성공적으로 종료되었음을 의미한다.
data 라는 명령어는 실제로 존재하지 않는 명령이다. 그래서 파일이 존재하지 않는 127이 결과값으로 나온다.
명령어 자체는 올바르게 사용하였으나 그 형식이 맞지 않는, 즉 문맥이 맞지 않는 syntax 에러는 1의 결과값을 가진다.
알아두면 나중에 써먹을데가 있을거 같으니 잘 알아두자.
2. test
test는 비교연산자이다.
명령어에 대한 실행결과를 true이면 0을, false 이면 1을 반환한다.
test 명령어는 다양한 연산자를 지원한다. 주로 쓰는 옵션으로는 아래와 같아 모두 true가 되는 기준으로 설명한다.
x -eq y x=y이면 true
x -gt y x>y면 true
x -ge y x>=y면 true
x -lt y x<y
x -le y x<=y
x -ne y x!=y(x가 y랑 같지 않으면 true)
-e 파일 파일이 존재하면 true
-d 파일 파일이 디렉토리면 true
-f 파일 파일이 파일이면 true
외우기 복잡한데 사실은 간단하다.
eq = equal
gt = greater than
ge = greater or equal
lt = less than
le = less or equal
ne = not equal
이렇게 하면 쉽게 외울 수 있다.
실전으로 test 를 사용해보자.
test 명령어를 사용하여 x가 5보다 작은지 물어봤다. x에는 현재 10이 들어있기 때문에 5보다 작은 숫자가 아니다. 결과값은 false 즉 1을 리턴하게 된다.
/etc안에 passwd 파일이 들어있는지 test로 확인해보면 결과값은 0, 즉 /etc안에는 passwd라는 파일이 있다는 말이다.
재밌는 점은 리눅스에서 test 명령어는 [ ] (중괄호)로 단축을 시킬 수가 있다.
x는 5보다 크기 때문에 0이라는 값이 출력된다.
중괄호에 바로 붙이면 안되고 반드시 한칸씩 떼줘야 한다.
[$x -gt 5] X
[ $x -gt 5 ] O
여기서 추가적인 것이 있는데 let이라는 명령어를 사용하면 산술을 가능하게 해준다.
test는 논리연산자이고, let은 산술 연산자이다. 산술 연산자는 우리가 흔히 아닌 +-*/ 이다.
알아두면 좋으니 기억해두자
3. if-then-fi
이 if, then, fi 문은 앞으로 굉장히 굉장히 굉장히 많이 보게 될 가능성이 높다. 반드시 잘 알아두어야 한다.
if 문은 코딩을 하는 사람은 설명할 필요가 없을 것이다. 조건문이다.
만약 어떤 조건을 거쳐서 해당 조건이 true 면은 then을 실행하고 해당 조건이 false면은 실행하지 않던지 else에 있는 것을 실행한다.
쉬운 설명을 위해 한국어로 먼저 설명하겠다.
한가지 주의할 점은 if, then, else, fi를 띄어쓰지 않고, 그 중간에 들어있는 명령어들은 띄어쓰기를 반드시 해야한다.
if [ x가 5보다 크면 ]
then
echo "x는 5보다 크다"
else
echo "x는 5보다 작다"
fi
만약 x가 5보다 크면? 그렇다면! "x는 5보다 크다" 라고 출력해!
근데 만약 그렇지 않으면? "x는 5보다 작다"라고 출력해! 라는 것이다.
예시를 보자
x는 3이니 당연히 5보다 작다.
근데 if 후에 x가 5보다 크면(gt), then, x가 5보다 크다 라고 출력하라고 한다.
해당 스크립트를 실행해본다.
아무런 결과가 없다. 왜냐, if문에서 5보다 커야 출력을 하는데 x가 5보다 작기 때문이다.
그렇다면 직접 입력을 받는 스크립트를 실행시켜 보자
입력받은 x값이 5를 넘으니까(10) 정상적으로 출력된다.
마지막으로 한 파일을 보자
만약 /etc에 passwd가 존재하면(then) /etc의 passwd를 출력하라
근데 만약 없으면(else) 파일이 없다고 화면에 출력해라 라는 스크립트이다.
실제 이 파일을 실행시켜보자.
정상적으로 출력이 되는 것을 보니 /etc/passwd는 존재하는 파일이다.
만약 파일을 아래와 같이 변경한다면
파일이 존재하지 않는다고 나온다.
즉 if 문에서는 then에 true일시 어떻게 할지, else 에는 false일지 어떻게 할지를 지정하면 된다.
4. case
case는 여러 조건에 따라 결과값이 전부 상이하여야 할 때 분기를 주는 역할을 한다.
말이 어려운데 쉽게 말하자면 조건이 3개 이상일 때 사용하면 좋다 라고 생각하자
예시를 살펴보자
case문은 case "$변수" in 으로 시작을 하며, 조건 하나당
패턴1) 명령어 ;;
이런식으로 패턴을 준다. 괄호 닫기와 ;; 을 주의해서 잘 사용하자.
또한 case문을 끝낼때는 esac을 반드시 기입해줘야 한다.
주의할점은 yes와 no에 있는 대괄호 [ ] 는 두가지를 다 사용할 수 있다는 말이다.
곧 Yes 를 입력하나 yes를 입력하나 "system will be restarted 를 출력한다는 말이다.
또한 *(전부) 마크는 yes나 no가 아닌 그 외의 모든 입력들에 대한 것 전체를 표시하는 문자이다.
실행결과로는 다음과 같다.
세가지 다른 입력에 따라 세가지 다른 결과값을 출력한다. 이것이 case문의 장점인 것이다.