본문 바로가기

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

[리눅스 / 유닉스 / 셸 스크립트 ] IF문 조건문 - 셸 프로그래밍 기초

 

[ Linux / Unix / shell scripting 링크 모음 ]

 

 

안녕하세요~! 오늘은 프로그래밍하면 가장 먼저 배우는 조건문에 대해서 공부해볼게요 ㅎㅎ

처음에 Shell scripting에서 조건문을 배우면 쫌 헷갈려요. 왜냐면 C언어, JAVA이런 것들이랑 유사해보이지만 약간의 사용 방법의 차이가 있거든요 ㅎㅎ 오늘 포스팅에서 확실히 기초를 잡고 갑시다 ㅎㅎ

 

--> C언어, JAVA언어 등 전반적인 IF문 기초 포스팅 <--

IF문 사용법

if문은 command 즉 명령을 받아요. 그래서 그 명령 수행이 정상 수행일 경우, 즉 exit 0을 배출하면 true로직(then)을 타고 비정상 수행이 되었을 경우 else 로직을 타게 됩니다.

☞비교 - 자바나 C언어 이런 프로그래밍언어에서 조건문은 조건이 1일 때, 즉 true일 때 then명령이 수행되고 결과값이 false 즉 0일 때 else구문을 타지만, 셸 스크립트에서 if문은 반대로!! 0일때 true로직을 타고, 0이 아닐 때, false로직을 탑니다.

또 맨 끝에 fi를 붙여줘야 해요!

◈ 단일 if문

command가 정상 수행 후 종료되었을 경우에만 '실행문장'을 실행합니다.

if command 
then 실행문장 
fi
if command ; then 실행문장 ; fi

요렇게 명령어 한 줄이 끝난다는 표기인 ';'를 넣어줌으로써 여러 줄을 한 줄로 압축할 수 있어요 :)

◈ if-else문

command가 정상 종료 되면 '실행문장1'을 수행, 비정상 종료가 되면 '실행문장2'를 수행합니다.

if command 
then 실행문장1 
else 실행문장2 
fi

◈ if ~ elif 문

if command 
then 실행문장1 
elif command then 실행문장2 
else 실행문장3 
fi

elif는 else if의 약자입니다. 이 elif는 여러개 사용해도 무방~!

if문 실습

가장 기본 명령어 ls를 이용해 실습해볼게요. ls는 파일 목록을 뽑아주는 명령어입니다.

일단 셸 스크립트를 짜볼까요? # vi test.sh -- 스크립트 파일을 아래 코드처럼 작성한 후 실행해보세요! 

# script 1 - 파일이나 디렉터리가 하나도 존재하니 않는 환경을 만들고 실행해보세요 
echo "scenario 1 : when no files" 
if ls 
then echo "succeed" 
else echo "fail" 
fi 

# script 2 - 파일이나 디렉터리를 만 든 후에 똑같은 명령을 실행해서 결과를 비교해볼게요 
echo "scenario 2 : when files exist" 
if ls ; then echo "succeed" ; else echo "fail" ; fi

결과는 둘 다 succeed가 뜹니다!

비록 파일이 없었어서 출력에 아무것도 뜨지 않았어도 ls명령어는 오류 없이 정상적으로 작동된 것이기 때문이야요

# script 3 - LOL이라는 명령어는 존재하지 않아요! 
echo "scenario 3 : wrong command" 
if LOL ; then echo "succeed" ; else echo "fail" ;fi 

# script 4 - if문 뒤에는 명령어가 와야 해요. 변수가 오면 실패한답니다 
echo "scenario 4 : when variable comes in" 
VAR="I am variable" 
if ${VAR} ; then echo "succeed" ; else echo "fail" ; fi

이렇게 존재하지 않는 명령어를 쳤을 때는 정상수행이 되지 않기 때문에 값fail로 뜨게 됩니다. 

또 명령어가 아닌 다른 형태 (ex 변수) 등을 if문의 조건으로 돌린다면 이것도 fail!

여기서 ${}는 변수에 담긴 값을 가리키죠 ㅎㅎ

 

↓ 실제 수행 결과 화면 ↓

이번 명령어는 ls대신 find를 써봤어요 ㅎㅎ

 

 

파일이 있던 없던 succeed를 출력해주는 것을 볼 수 있어요.

시나리오 3는 aaa라는 디렉터리에서 파일을 찾아달라는 명령인데, aaa라는 디렉터리가 없기 때문에 해당 명령어가 정상적으로 수행될 수가 없어서 fail 결과가 나온 것을 알 수 있어요.

EXIT CODE 기준 true/false 판별

시나리오1, 시나리오2 특성 덕분에 (정상 수행 또는 비정상 수행(exit code)으로 분기하는 if의 특성)

어떤 작업이 수행되고 나서 정상 수행일 경우에만 다음 작업을 이어서 수행하게 할 수 있습니다.

if find . -type f -name "*.c" | xargs -I{} mv {} /sourceCode 
then echo "작업 완료! 이후 후처리 진행 코드 블라블라" 
else echo "파일 이동 실패!" 
fi

이 if안의 명령은 소스 파일들만 골라서 sourceCode라는 디렉터리로 다 옮겨줘! 라는 명령어인데,

중간에 옮기는게 끊기거나 실패하면 "파일 이동 실패!"를 출력하도록 했어요 ㅎㅎ 권한이 없어서 수행되지 않을 경우에도 실패 로직을 가겠죠? ㅎㅎ

내부 값 기준 true/false 판별

근데 위의 예시에서 if는 find 결과가 있던 없던 무조건 성공 실패 기준으로 되니까 좀 답답하죠 ㅠㅠ

if ( a > 0 ) 이런 조건문 많이 썼잖아요 이런 비교연산도 수행하고 싶고,

내가 무언가 검색하거나 추출하는 명령어를 쳤을 때, 해당 결과가 존재하면 true로직으로~ 그리고 결과 값이 없으면 false 로직으로 가는 그런 것도 필요해요. 이 명령은 아래와 같은 코드를 수행해주면 됩니다.ㅎㅎ

if [ $( find ./dir -type f ) ] ; then echo "파일 있음" ; else echo "파일 없음" ; fi

find는 찾으라는 명령어이므로 $()내부 명령어 의미는 'dir라는 디렉터리에서 파일만 찾아줘' 입니다 ㅎㅎ 

앞이랑 차이점이 있죠?!

바로 if 안에 대괄호가 들어갔어요 ㅎㅎ 사실 이 대괄호는 test라는 명령어입니다.

if test $( find ./dir -type f ) ; then echo "파일 있음" ; else echo "파일 없음" ; fi

이거랑 똑같음 ㅎㅎ

즉 test라는 명령어나 대괄호가 들어가면 종료 코드로 if문이 결정되는게 아니라 더 넓은 범위로 비교연산을 활용할 수 있어요. 어째서 이게 가능한지, test라는 명령어가 if문과 어떻게 시너지를 발휘해 활용되는지는 다음 포스팅에서 이어가도록 할게요!!

 

다음 포스팅은 여기!

[리눅스 / 유닉스 / 셸 스크립트] 조건문과 함께 쓰이는 test 명령어 사용법 및 활용 예시

[리눅스 / 유닉스 / 셸 스크립트 프로그래밍 ] 완전 정복 목차 안녕하세요~! 오늘은 오랜만에 리눅스유닉스 포스팅으로 찾아왔어요 ㅎㅎ 오늘은 test 명령어에 대해서 공부해봅시다. test는 조건문

jhnyang.tistory.com

공감, 댓글, 광고보답은 더 좋은 포스팅을 공유하는데 힘이 됩니다!