쉘 스크립트 - 함수편

Violet_Evgadn·2023년 5월 1일
0

Linux

목록 보기
26/34

if문

if문 형식

if [ 조건식 ]
then
	(조건식이 True일 경우 실행문)
else
	(조건식이 False일 경우 실행문)
fi

여기에서 중요한 부분이 fi이다.

위에서 보면 다른 프로그래밍 언어와는 달리 if() { }의 구조가 아님을 알 수 있다.
즉, 쉘 스크립트는 if문의 종료 지점이 어디인지를 알 수가 없다.

따라서 쉘 스크립트에서는 fi를 통해 if문의 종료 지점을 알려야 한다.

또한 다른 프로그래밍 언어에서 else구문이 선택이듯 쉘 스크립트에서도 then은 필수이지만 else는 필수가 아니다.

마지막으로 중요한 것이 있는데 if문 뒤에 띄어쓰기가 무조건 존재해야 하며, '[' 뒤와 ']' 앞에도 띄어쓰기가 무조건 존재해야 한다.

[]의 의미

이전에 쉘 스크립트를 통한 파일 비교를 공부하다 찾은 재미있는 성질이 있어 정리했다.

if문에서 조건식을 [ ]로 감싸는 것을 볼 수 있다.
그런데 Bash에서는 [가 명령어로도 사용될 수 있다.

이것이 어떠한 의미냐면 True, False, 혹은 비교 연산자가 조건식으로 들어갈 경우 [ ]로 감싸줘야 하는데, 사실이 [가 명령어의 역할을 수행한다는 것이다.

반대로 조건식으로 들어가야 하는 값이 명령어라면 [ ]로 감쌀 경우 [ 명령어와 조건식 명령어 2개가 실행되기 때문에 에러가 발생할 것이다.

따라서 조건식으로 명령문을 쓰기 위해선 [ ]를 사용하지 않아야 한다.

조건식

입력값 판단

  • yes, y, Yes, YES : yes, y, Yes, YES가 입력되었으면 True

  • [nN]* : 입력된 값의 맨 앞 자리 문자가 n이거나 N이면 True

    • 편의상 n, N으로 했지만 모든 문자로 입력 가능하다.

문자열 비교

  • "string1"="string2" : 동일하면 True
  • "string1"!="string2" : 동일하지 않으면 True
  • -n "string" : "string"이 Null이 아니면 True
  • -z "string" : "string"이 Null이면 True

산술 비교

형식은 아래와 같이 사용하면 된다.

[비교값1] (산술 비교 연산자) [비교값 2]
# 띄어쓰기가 사이에 존재한다는 것에 신경쓰자  
  • -eq : 같을 경우 True
  • -ne : 같지 않을 경우 True
  • -gt : 비교값1이 클 경우 참
  • -ge : 비교값1이 크거나 같을 경우 참
  • -lt : 비교값1이 작으면 참
  • -le : 비교값1이 작거나 같으면 참
  • ! : 조건식 맨 앞에 붙을 경우 Not을 의미함

추가로 이중 소괄호 안에서는 <>도 사용할 수 있다.

  • ex : (("$a" < "$b"))

파일 조건 비교

  • -d file-name : file이 Directory면 True
  • -e file-name : file이 존재하면 True
  • -f file-name : file이 일반 파일이면 True
  • -s file-name : file size가 0이 아니면 참
  • -r file-name : file이 읽기 가능한 파일이면 True
  • -w file-name : file이 쓰기 가능한 파일이면 True
  • -x file-name : file이 실행 가능한 파일이면 True

And와 Or

And와 Or의 사용 방법은 아래와 같다.

[조건식1] (And, or 연산자) [조건식2]
  • -a, && : and
  • -o, || : or

case ~ esac문

case문 형식

case문은 다른 프로그래밍 언어의 Switch문과 동일한 역할을 수행한다.

switch문에서는 case를 통해 상황을 분기하고 break문을 추가하여 1개의 분기문만 실행되도록 하지만 쉘 스크립트의 case ~ esac문에서는 이런 과정이 필요 없다.

단순히 )를 통해 상황을 분기해 주면 된다.

case 조건식 in
  조건1)
  	(조건1이 True일 경우 실행문)
  조건2)
  	(조건2가 True일 경우 실행문)
  ...
  *)
  	(위에서 기입한 조건이 모두 False일 경우 실행문)
esac

반복문

for

# 방법 1 : for문 변수로 들어갈 값들을 리스트로 입력
for [변수] in [변수에 들어갈 값들]
do
  [반복문에서 실행할 명령]
done
  
# 방법 2 : for문 변수로 들어갈 값들을 함수로 입력
for ((변수에 대한 함수))
do
  [반복문에서 실행할 명령]
done

이렇게만 보면 잘 이해가 안가니 예시를 통해 자세히 알아보자.

# 방법 1 예시
for i in 1 2 3 4 5
do
  sum=`expr $sum + $i`
done
  
# 방법 2 예시
for ((i=1;i<=5;i++))
do
  sum=`expr $sum + $i`
done

추가로 {1..10..1}문구를 통해 ((i=1;i<=10;i++))을 대체할 수도 있다.
규격화시키자면 {초기값..마지막 값..증가하는 폭}으로 생각할 수 있다.

while

while [조건식]
do
  (조건식이 True일 경우 실행문)
done

다른 프로그래밍 언어의 while문처럼 조건식이 False가 될 때까지 계속 반복하여 명령문을 실행하는 함수이다.

for문 형식과 유사하므로 자세한 설명은 생략하겠다.

until

until [조건식]
do
  (조건식이 False일 경우 실행문)
done

while문의 조건식에 !가 붙었다고 생각하면 된다.
while문과는 다르게 조건식이 False일 때 계속 반복 실행되다가 조건식이 True가 됐을 때 반복문이 종료된다.

반복문의 탈출을 위한 예약어

  • break : 반복문을 종료하고 빠져나올 때 사용
  • continue : 반복문에서 조건식으로 돌아갈 때 사용
  • exit : 해당 프로그램을 완전히 종료
  • return : 함수 안에서 사용되어 함수를 호출한 곳으로 돌아갈 때 사용

exit이라는 쉘 스크립트 실행을 완전히 종료하는 명령이 추가된 것을 제외하면 다른 프로그래밍 언어와 유사함을 볼 수 있다.


기타 명령어

eval문

문자열을 명령문으로 인식하여 실행하는 명령문이다.

eval문은 다른 프로그래밍 언어에서는 보기 힘든 명령이기 때문에 예시를 통해 파악해 보자.

str="ls -l | tail -5"
echo $str
eval $str
exit 0


명령문이 실행되었음을 확인할 수 있다.

export문

다른 프로그램에서도 사용 가능한 외부 변수를 선언하는 명령문이다.

변수 선언 구문 앞에 export만 붙여주면 된다.

printf문

C언어의 printf와 매우 유사하며 형식을 지정하여 출력하기 위한 명령문이다.

C언어에서는 형식과 출력할 값을 ( )로 묶었지만 쉘 스크립트에서는 형식만 " "로 묶는다는 차이가 존재한다.

printf "형식" 데이터
  • %d : 정수형
  • %f : 실수형
  • %s : String형
  • ...

set과 $()

$(command)는 명령문(command)의 실행 결과를 사용한다는 것을 의미하며 set은 결과를 파라미터로써 이용한다는 것을 의미한다.

set으로 설정한 Parameter들은 $n을 사용하여 n번째 파라미터 값을 사용할 수 있다.

예시 코드를 통해 알아보자.

echo "오늘은 $(date)"
set $(date)
  
echo "오늘은 $4 요일이다"
exit 0

shift문

파라미터가 10개가 넘을 때 주로 사용되는 명령문이다.

shift 명령은 Command의 Parameter들을 위치지정 매개변수에 할당한 뒤 왼쪽으로 이동시키는 역할을 가지고 있다.

이때 0번째 매개변수는 shift에 영향을 받지 않는다.

그리고 이동이 완료되었다면 명령줄을 벗어난 인수들은 분실되며 다시 사용할 수 없게 된다.

조금 설명이 어려운데, 예를 들어 Paremter로써 a1, a2, a3, a4가 입력되었다고 가정하자.
이 때 shift 2가 실행될 경우 Parameter들이 왼쪽으로 2칸씩 이동할 것이다.
이 경우 a1과 a2는 명령줄을 벗어나므로 없어지고 a3, a4만 인식 가능해지는 것이다.

예시를 통해 확인해 보자.

#!/bin/bash
echo "Parmameters : $*"
shift 2
echo "After Shift : $*"
shift 2
echo "After Shift Twice : $*"
exit 0


User-defined Function

사용자가 직접 만드는 쉘 함수이다.

Function을 만드는 법은 간단하다.

[함수이름] () {
  [함수에서 실행할 명령들]
  return
}

사실 User-defined Function에서 중요한 것은 함수를 만드는 과정보다는 Parameter를 주입하는 과정이다.
함수를 사용할 때 myfunction()과 같이 활용하기보다는 myfunction(3, 4)처럼 연산을 위한 Parmeter를 주입해 주는 것이 일반적이기 때문이다.

User-Defined Function에서는 $n을 통해 입력한 n번째 Parameter를 사용할 수 있다.

또한 User-Deinfed Function을 사용할 때는 [함수이름] 값1 값2 값3의 형식으로 사용할 수 있다.

2개의 값을 더하는 함수인 mysum을 만든 뒤 실행까지 시키는 쉘 스크립트를 통해 파악해 보자.

#!/bin/bash
mysum(){
  echo `expr $1 + $2`
}
  
echo "123 + 456은?"
mysum 123 456
exit 0

profile
혹시 틀린 내용이 있다면 언제든 말씀해주세요!

0개의 댓글