쉘 스크립트 Part 2: - 쉘 연산자
Shell 연산자 (Operators)
쉘 스크립트에서 숫자와 문자, 파일을 처리하기 위한 다양한 연산자를 제공합니다.
1. 비교 연산자 (관계 연산자)
기본 개념
- 쉘 스크립트에서 숫자와 문자, 파일을 처리하는 방법
- 실행 결과를 true(0) 또는 false(1)로 리턴
- 형식:
[ 명령어 ]또는test <명령어>
중요: [ 명령어 ] 사용 시 명령어 사이 양쪽에 공백 필수
# 올바른 사용
[ $a -gt $b ]
# 잘못된 사용 (공백 없음)
[$a -gt $b]
a) 숫자 크기 비교
숫자 크기를 비교하지만 소수점 이하의 숫자는 무시됩니다.
| 표현방식 | 의미 |
|---|---|
[ $A -gt $B ] |
A가 B보다 크다 (greater than) |
[ $A -lt $B ] |
A가 B보다 작다 (less than) |
[ $A -ge $B ] |
A가 B보다 크거나 같다 (greater or equal) |
[ $A -le $B ] |
A가 B보다 작거나 같다 (less or equal) |
[ $A -eq $B ] |
A와 B가 같다 (equal) |
[ $A -ne $B ] |
A와 B가 같지 않다 (not equal) |
예제:
#!/bin/bash
a=10
b=20
if [ $a -lt $b ]; then
echo "$a는 $b보다 작습니다"
fi
if [ $a -eq 10 ]; then
echo "a는 10과 같습니다"
fi
b) 문자열 비교
문자열 비교 시 반드시 좌우에 ” “ 따옴표를 사용해야 합니다.
| 표현방식 | 참이 되는 경우 |
|---|---|
[ "문자열1" ]=[ "문자열2" ] |
두 문자열이 같으면(== 도 가능) 참 |
[ "문자열1" ] ! [ "문자열2" ] |
두 문자열이 다르면 참 |
[ -z "string" ] |
문자열이 길이가 0 이면 참 (zero/empty string: true) |
[ -n "string" ] |
문자열의 길이가 0보다 크면 참 (not empty string : true) |
예제:
#!/bin/bash
str1="hello"
str2="world"
if [ "$str1" = "$str2" ]; then
echo "문자열이 같습니다"
else
echo "문자열이 다릅니다"
fi
if [ -z "$str1" ]; then
echo "문자열이 비어있습니다"
else
echo "문자열이 비어있지 않습니다"
fi
c) 파일 테스트 연산자
| 표현방식 | 의미 |
|---|---|
[ -f 파일 ] |
파일이 존재하고 일반 파일이면 참 |
[ -d 디렉터리 ] |
디렉터리가 존재하면 참 |
[ -e 파일 ] |
파일이나 디렉터리가 존재하면 참 |
[ -r 파일 ] |
파일이 읽기 가능하면 참 |
[ -w 파일 ] |
파일이 쓰기 가능하면 참 |
[ -x 파일 ] |
파일이 실행 가능하면 참 |
[ -s 파일 ] |
파일 크기가 0보다 크면 참 |
예제:
#!/bin/bash
file="/etc/passwd"
if [ -f "$file" ]; then
echo "$file 파일이 존재합니다"
fi
if [ -r "$file" ]; then
echo "$file 파일을 읽을 수 있습니다"
fi
2. 산술 연산자
기본 산술 연산 방법
쉘에서 숫자 계산을 위한 4가지 방법:
expr- 간단한 연산용bc- 복잡한 연산 및 소수점 계산용let- 변수 계산용$(( ))- 가장 많이 사용되는 방법
1) expr 사용
expr 사용 시 주의사항 (3가지):
- expr로 지정하는 경우 백틱(`) 을 사용해야 합니다
- 연산자
*와 괄호 앞에는 백슬래시() 를 같이 사용해야 합니다 - 연산자와 숫자, 변수, 기호 사이에는 공백(Space)이 존재해야 합니다
| 수식 | 의미 | 수식 | 의미 |
|---|---|---|---|
| expr | 숫자 계산 | * | 곱하기 ( W* )로 사용 |
| + | 더하기 | / | 나누기 |
| - | 빼기 | % | 나머지 값 |
예제:
#!/bin/bash
# expr 사용 (백틱 사용)
result=`expr 10 + 5`
echo "10 + 5 = $result"
# 곱셈은 백슬래시 필요
result=`expr 10 \* 5`
echo "10 * 5 = $result"
# 나눗셈
result=`expr 10 / 3`
echo "10 / 3 = $result"
# 나머지
result=`expr 10 % 3`
echo "10 % 3 = $result"
2) bc 명령어 (복잡한 연산용)
장점:
- 띄어쓰기와 이스케이프 문자 변환이 필요 없음
- 소수점 계산 가능
- echo와 pipe를 사용하거나 bc 명령어만 입력하여 사용
| 수식 | 의미 | 수식 | 의미 |
|---|---|---|---|
| bc | 숫자 계산 | * | 곱하기 ( W* )로 사용 |
| + | 더하기 | / | 나누기 |
| - | 빼기 | % | 나머지 값 |
예제:
#!/bin/bash
# 기본 사용
echo "10 + 5" | bc
# 출력: 15
# 소수점 계산 (scale=소수점 자릿수)
echo "scale=3; 8/3" | bc
# 출력: 2.666
# 변수 사용
a=10
b=3
result=$(echo "scale=2; $a / $b" | bc)
echo "10 / 3 = $result"
참고: scale=3 은 소수점 3자리에서 끊어주는 명령어
3) let 또는 $(( ))
가장 간편하고 많이 사용되는 방법입니다.
예제:
#!/bin/bash
# let 사용
let sum=10+5
echo "let sum = $sum"
# (( )) 사용
((sum=10+5))
echo "((sum)) = $sum"
# $(( )) 사용 (가장 권장)
sum=$((10+5))
echo "\$((sum)) = $sum"
# 복잡한 연산
result=$((10 * 5 + 3))
echo "10 * 5 + 3 = $result"
Shell에서 산술연산 정리
1. (( ))
- 산술 연산을 그룹화 할 때 사용
- 계산된 결과를 변수에 저장하지 않고 즉시 사용할 때 사용
((sum=10+5))
2. $(( ))
- 산술 연산 결과를 명시적으로 변수에 저장하거나 다른 명령어처럼 사용하고 싶을 때 사용
- 중첩명령:
$( )은 명령어를 실행하고 그 출력을 반환
sum=$((10+5))
echo "결과: $sum"
4) 증가, 감소 연산자
| 연산자 | 기능 | 연산 예 |
|---|---|---|
| ++ | 값을 1씩 더함 | val=++num (먼저 num 값이 1 증가한 후 val 변수에 대입) val=num++ (val 변수에 기존 num 값을 먼저 대입한 후 num 값 1 증가) |
| – | 값을 1씩 뺌 | val=–num (먼저 num 값이 1 감소한 후 val 변수에 대입) val=num– (val 변수에 기존 num 값을 먼저 대입한 후 num 값 1 감소) |
예제:
#!/bin/bash
num=10
# 전위 증가
echo "num = $num"
((++num))
echo "++num = $num"
# 후위 증가
result=$((num++))
echo "num++ = $result (num은 이제 $num)"
3. 논리 연산자
기본 논리 연산자
&&: and 연산자 (또는-a)||: or 연산자 (또는-o)
예제:
#!/bin/bash
age=25
# AND 연산
if [ $age -gt 18 ] && [ $age -lt 30 ]; then
echo "나이는 18세 초과 30세 미만입니다"
fi
# OR 연산
if [ $age -lt 18 ] || [ $age -gt 60 ]; then
echo "청소년이거나 노인입니다"
else
echo "성인입니다"
fi
# -a, -o 사용 (한 개의 [ ] 안에서 사용)
if [ $age -gt 18 -a $age -lt 30 ]; then
echo "나이는 18세 초과 30세 미만입니다"
fi
삼항 연산자 (Ternary Operator)
형식: 조건1 && 조건2 || 조건3
조건 1이 참인 경우 조건 2를 실행하고, 거짓이면 조건3을 실행합니다.
예제:
#!/bin/bash
age=20
# 삼항 연산자
[ $age -ge 18 ] && echo "성인입니다" || echo "미성년자입니다"
# 변수 할당에도 사용 가능
status=$([ $age -ge 18 ] && echo "adult" || echo "minor")
echo "Status: $status"
실전 예제
예제 1: 계산기 프로그램
#!/bin/bash
echo "=== 간단한 계산기 ==="
echo -n "첫 번째 숫자: "
read num1
echo -n "두 번째 숫자: "
read num2
echo "덧셈: $((num1 + num2))"
echo "뺄셈: $((num1 - num2))"
echo "곱셈: $((num1 * num2))"
echo "나눗셈: $(echo "scale=2; $num1 / $num2" | bc)"
예제 2: 파일 검사 스크립트
#!/bin/bash
file=$1
if [ -z "$file" ]; then
echo "사용법: $0 <파일명>"
exit 1
fi
echo "=== 파일 검사: $file ==="
[ -e "$file" ] && echo "파일이 존재합니다" || echo "파일이 존재하지 않습니다"
[ -f "$file" ] && echo "일반 파일입니다"
[ -d "$file" ] && echo "디렉터리입니다"
[ -r "$file" ] && echo "읽기 가능합니다"
[ -w "$file" ] && echo "쓰기 가능합니다"
[ -x "$file" ] && echo "실행 가능합니다"
예제 3: 숫자 비교 프로그램
#!/bin/bash
echo -n "첫 번째 숫자를 입력하세요: "
read a
echo -n "두 번째 숫자를 입력하세요: "
read b
if [ $a -gt $b ]; then
echo "$a가 $b보다 큽니다"
elif [ $a -lt $b ]; then
echo "$a가 $b보다 작습니다"
else
echo "$a와 $b는 같습니다"
fi
주요 포인트 정리
- 비교 연산자
- 숫자 비교:
-gt,-lt,-ge,-le,-eq,-ne - 문자열 비교:
=,!=,-z,-n(반드시 따옴표 사용) - 파일 테스트:
-f,-d,-e,-r,-w,-x,-s
- 숫자 비교:
- 산술 연산자
expr: 간단한 연산 (공백 필수, * 앞에 \ 필요)bc: 복잡한 연산, 소수점 계산 가능let,(( )),$(( )): 가장 편리한 방법
- 논리 연산자
&&(AND),||(OR)-a(AND),-o(OR) - [ ] 안에서 사용
- 주의사항
[ ]사용 시 양쪽 공백 필수- 문자열 비교 시 따옴표 필수
- expr 사용 시 연산자와 피연산자 사이 공백 필수
댓글 남기기