Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

Bash 조건식 완벽 가이드: 실전 예제 6가지 (-e, -eq, -z, !=, [, [[)

Bash 표현식(expression)은 연산자, 기능 또는 값을 조합하여 Bash 조건문을 구성하는 요소입니다. 조건식은 숫자, 문자열 또는 성공 시 반환 상태가 0이 되는 모든 명령을 다루는 이항(binary) 또는 단항(unary) 표현식일 수 있습니다.

파일을 검사할 때 사용할 수 있는 다양한 조건식이 있으며, 그중 자주 쓰이는 유용한 조건식들은 다음과 같습니다.

  • [ -e 파일경로 ] : 파일이 존재하면 참(true)을 반환합니다.
  • [ -x 파일경로 ] : 파일이 존재하고 실행 가능하면 참을 반환합니다.
  • [ -S 파일경로 ] : 파일이 존재하고 소켓 파일이면 참을 반환합니다.
  • [ expr1 -a expr2 ] : 두 표현식이 모두 참일 때 참을 반환합니다 (AND).
  • [ expr1 -o expr2 ] : 두 표현식 중 하나라도 참일 때 참을 반환합니다 (OR).

파일, 문자열, 숫자를 검사하는 더 많은 조건식이 궁금하다면 Bash 매뉴얼 페이지(man page)를 참고하시기 바랍니다.

예제 1. 파일 존재 여부 확인하기

아래 Bash 셸 스크립트 코드는 절대 경로를 포함한 파일명을 입력받아 해당 파일의 존재 여부를 확인하고, 그에 맞는 정보를 출력합니다.

$ cat exist.sh
#! /bin/bash
file=$1
if [ -e $file ]
then
	echo -e "File $file exists"
else
	echo -e "File $file doesnt exists"
fi

$ ./exist.sh /usr/bin/boot.ini
File /usr/bin/boot.ini exists

Bash if 문의 다양한 유형을 더 자세히 알고 싶다면 관련 기초 문서를 참고해 보세요.

예제 2. 숫자 비교하기

아래 스크립트는 사용자로부터 정수 두 개를 입력받아 두 수가 같은지, 혹은 어느 쪽이 크거나 작은지 판별합니다.

$ cat numbers.sh
#!/bin/bash
echo "Please enter first number"
read first
echo "Please enter second number"
read second

if [ $first -eq 0 ] && [ $second -eq 0 ]
then
	echo "Num1 and Num2 are zero"
elif [ $first -eq $second ]
then
	echo "Both Values are equal"
elif [ $first -gt $second ]
then
	echo "$first is greater than $second"
else
	echo "$first is lesser than $second"
fi

$ ./numbers.sh
Please enter first number
1
Please enter second number
1
Both Values are equal

$ ./numbers.sh
Please enter first number
3
Please enter second number
12
3 is lesser than 12

Bash 스크립팅이 처음이라면 먼저 Bash 입문 튜토리얼부터 살펴보는 것을 추천합니다.

예제 3. 간단한 사칙연산 계산기

이 예제는 Bash 변수(inp1, inp2)에 대해 수행할 산술 연산의 종류를 입력받습니다. 산술 연산에는 덧셈, 뺄셈, 곱셈이 포함됩니다.

$ cat calculator.sh
#!/bin/bash
inp1=12
inp2=11
echo "1. Addition"
echo "2. Subtraction"
echo "3. Multiplication"
echo -n "Please choose a word [1,2 or 3]? "
read oper

if [ $oper -eq 1 ]
then
	echo "Addition Result " $(($inp1 + $inp2))
else
	if [ $oper -eq 2 ]
	then
		echo "Subtraction Result " $(($inp1 - $inp2))
	else
		if [ $oper -eq 3 ]
		then
			echo "Multiplication Result " $(($inp1 * $inp2))
		else
			echo "Invalid input"
		fi
	fi
fi

$ ./calculator.sh
1. Addition
2. Subtraction
3. Multiplication
Please choose a word [1,2 or 3]? 4
Invalid input

Bash 특수 매개변수($*, $@, $#, $$, $!, $?, $-, $_)의 사용법을 익혀두면 스크립트 작성이 한결 수월해집니다.

예제 4. IP 주소를 입력받아 핑(Ping) 테스트하기

다음 스크립트는 IP 주소를 입력받아 해당 주소에 도달 가능한지 확인한 후, 그 결과에 맞는 메시지를 출력합니다.

$ cat ipaddr.sh
#!/bin/bash
echo "Enter the Ipaddress"
read ip

if [ ! -z $ip ]
then
	ping -c 1 $ip
	if [ $? -eq 0 ] ; then
		echo "Machine is giving ping response"
	else
		echo "Machine is not pinging"
	fi
else
	echo "IP Address is empty"
fi

$ ./ipaddr.sh
Enter the Ipaddress
10.176.191.106

Pinging 10.176.191.106 with 32 bytes of data:

Reply from 10.176.191.106: bytes=32 time<1ms TTL=128

Ping statistics for 10.176.191.106:
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
Machine is giving ping response

이 예제에서 -z는 문자열 길이가 0일 때(즉, 빈 값일 때) 참을 반환합니다. 조건 앞에 부정 연산자 !가 붙으면 표현식이 거짓일 때 if 블록 안으로 진입하여 실행됩니다. 따라서 IP 주소가 빈 값이 아닌 경우에만 진입하여 해당 IP에 도달 가능한지 검사하게 됩니다.

예제 5. 설치 스크립트 (root 실행 방지)

대부분의 패키지 설치 스크립트는 root 사용자로 실행되는 것을 허용하지 않습니다. 스크립트는 실행 중인 사용자를 검사하여 오류를 출력합니다.

아래 스크립트는 실행자가 root가 아닌 경우에만 오라클(Oracle) 설치 스크립트를 실행하도록 허용합니다.

$ cat preinstaller.sh
#!/bin/bash
if [ `whoami` != 'root' ]; then
	echo "Executing the installer script"
	./home/oracle/databases/runInstaller.sh
else
	echo "Root is not allowed to execute the installer script"
fi

# root 사용자로 실행했을 때,
# ./preinstaller.sh
Root is not allowed to execute the installer script

이 예제에서는 whoami 명령의 출력 결과를 "root"라는 단어와 비교합니다. 문자열 비교에는 ==, !=, < 등을 사용해야 하며, 숫자 비교에는 eq, ne, lt, gt를 사용해야 합니다.

예제 6. 향상된 대괄호 [[ ]] 사용하기

앞선 모든 예제에서는 조건식을 감쌀 때 대괄호 하나([ ])만 사용했습니다. 하지만 Bash는 이중 대괄호([[ ]])도 지원하며, 이는 단일 대괄호 문법의 향상된 버전 역할을 합니다.

$ cat enhanced.sh
#!/bin/bash
echo "Enter the string"
read str
if [[ $str == *condition* ]]
then
	echo "String "$str has the word \"condition\"
fi

$ ./enhanced.sh
Enter the string
conditionalstatement
String conditionalstatement has the word "condition"
  • [ 는 test 명령의 동의어(synonym)입니다. 셸에 내장되어 있지만 새 프로세스를 생성합니다.
  • [[ 는 이를 개선한 새로운 버전으로, 프로그램이 아닌 키워드(keyword)입니다.
  • [[ 는 Korn 셸과 Bash에서 지원됩니다.
  • 위 예제에서 변수 $str에 어느 위치든 "condition"이라는 구문이 포함되어 있으면 조건이 참이 됩니다.
  • 이것은 셸의 globbing(와일드카드 패턴 매칭) 기능으로, [[ (이중 대괄호)를 사용할 때만 지원되므로 인수를 따옴표로 묶지 않아도 되는 경우가 많습니다.