
if-then 구문 사용하기
구조적 명령의 가장 기본은 if-else 구문이다. 형식은 다음과 같다.
if command
then
command1
command2
...
elif command
then
command3
command4
...
else
command5
command6
...
fi
일반적인 프로그래밍 언어에서는 if문 다음에 오는 객체는 True/False 값을 평가하는 표현식이나,
bash 쉘의 if문은 그 줄에 정의된 명령을 실행한다. 이 명령의 종료 상태가 0이라면 then 뒤에 명령이 실행되고,
0이 아니라면 실행되지 않는다.
test 명령 사용하기
위의 방법은 bash의 if-then 구문이 명령의 종료 상태 코드말고도 다른 조건은 평가할 수 없다.
하지만 test 명령을 사용함으로써 조건의 참/거짓을 가지고 if-then 구문을 사용할 수 있다.
if test condition
then
command
fi
또는 대괄호를 사용하는 방법이 존재한다.
if [ condition ]
then
command
fi
테스트 명령 및 테스트 조건은
1. 숫자 비교
2. 문자열 비교
3. 파일 비교
세 가지가 가능하다.
1. 숫자 비교 사용하기
-eq, -ge, -gt, -le, -lt, -ne 파라미터를 사용해서 두 숫자 값을 비교할 수 있다.
a=10
b=20
if [ $a -gt 5 ]; then
echo "a > 5"
fi
if [ $a -eq $b ]; then
echo "a == b"
fi
다만 bash 쉘은 정수만을 처리할 수 있다. 조건 테스트를 할 때는 실수를 사용할 수 없다.
2. 문자열 비교 사용하기
=, !-, < , -n(문자열의 길이가 0보다 큰지 검사), -z(문자열의 길이가 0인지 검사)를 통해 문자열을 비교할 수 있다.
다만 주의할 점은 문자열의 대소를 비교할 때 부등호를 escape 해야하고 sort 명령과 동일하게 작동하지 않는다는 것이다.
왜냐하면 부등호를 escape 해주지 않으면 쉘은 이를 리다이렉트 기호로 해석하므로 종료 상태 코드를 평가하기 때문이다.
비교 테스트에서는 표준 ASCII 순서를 사용하고, sort 명령은 시스템 로케일의 언어 설정에 정의된
정렬 순서를 사용한다. 영어 라면 로케일 설정은 소문자를 대문자보다 앞서서 정렬하도록 지정한다.
-z 옵션을 통해 변수의 길이가 0인지 검사할 수도 있지만, 정의되지 않은 변수인지도 알 수 있다.
(정의되지 않은 변수는 무자열 길이를 0으로 간주)
3. 파일 비교 사용하기
아래는 파일 비교 테스트를 정리한 표이다.
| 비교 | 설명 |
| -d file | 파일이 존재하고 디렉토리인지 검사 |
| -e file | 파일/디렉토리가 존재하는지 검사 |
| -f file | 파일이 존재하고 파일인지 검사 |
| -r file | 파일이 존재하고 읽을 수 있는지 검사 |
| -s file | 파일이 존재하고 비어 있지 않은지 검사 |
| -w file | 파일이 존재하고 기록할 수 있는지 검사 |
| -x file | 파일이 존재하고 실행할 수 있는지 검사 |
| -O file | 파일이 존재하고 현재 사용자가 소유한 것인지 검사 |
| -G file | 파일이 존재하고 기본 그룹이 현재 사용자와 같은지 검사 |
| file1 -nt file2 | file1이 file2보다 새 것인지 검사 |
| file1 -ot file2 | file1이 file2보다 오래된 것인지 검사 |
복합 테스트 사용하기
if-then 구문을 사용할 때 여러 조건을 만족할 때만 실행시키고 싶다면 다음과 같이 사용한다.
# AND
[ cond1 ] && [ cond2 ]
# OR
[ cond1 ] || [ cond2 ]
고급 if-then 기능 사용하기
bash 쉘은 수학 표현식을 위한 이중 괄호와 고급 문자열 처리 기능을 위한 이중 대괄호 기능 두 가지를 제공한다.
이중 괄호 사용하기
이중 괄호 명령은 ++, --, !(논리 부정), ~(비트 부정), **(지수화), <<(비트 왼쪽 시프트), >>(비트 오른쪽 시프트),
&(비트 단위 AND), |(비트 단위 OR), &&(논리 AND), ||(논리 OR)와 같은 기호를 사용할 수 있다.
val1=10
if (( $val1 ** 2 > 90 )); then
(( val2 = $val1 ** 2 ))
echo "The square of $val1 is $val2"
fi
이중 대괄호 사용하기
이중 대괄호 표현식은 패턴 일치 기능을 제공한다.
if [[ $USER == r* ]]; then
echo "Hello, $USER"
else
echo "I don't know you"
fi
case 명령 알아보기
if문에 조건이 여러가지이면 case문을 사용하는게 더 편리할 수 있다. 아래와 같이 사용한다.
case variable in
pattern1 | pattern2)
command1;;
pattern3)
command2;;
*)
command3;;
esac
다음은 예시이다.
#!/bin/bash
case $USER in
rich | barbara
echo "Welcome, $USER"
echo "Welcome your visit";;
testing)
echo "Special testing account";;
*)
echo "Sorry, not allowed";;
esac'LINUX > 리눅스 쉘 스크립트 바이블 정리' 카테고리의 다른 글
| [리눅스 바이블] 14. 사용자 입력 처리 (0) | 2022.03.21 |
|---|---|
| [리눅스 바이블] 13. 반복문 사용하기 (0) | 2022.03.14 |
| [리눅스 바이블] 11. 스크립트 구축의 기초 (0) | 2022.02.27 |
| [리눅스 바이블] 8. 파일시스템 관리하기 (0) | 2022.02.26 |
| [리눅스 바이블] 7. 리눅스 파일 사용 권한 이해하기 (0) | 2022.02.09 |