#! /bin/bash
if [ “$1” = “bin” ]; then
echo “OK”
else
echo “NOK”
fi
문법상 주의점
if [ “$1” = “bin” ] then #세미콜론없어서 에러
#아래와 같이 다음 행에 then을 기재하면 세미콜론 생략 가능
if [ “$1” = “bin” ]
then
if 뒤에 [ 은 조건식이 아니라 명령어이다. ($ type [ 명령어를 입력하면 [ 는 내장이라고 출력 함, 즉 단순 괄호가 아니라 명령어이며 이어지는 “$1”, =, “bin”, ] 은 전부 인자 값 이다.)
[] 전후에 반드시 공백이 있어야함.
if [“$1” = “bin”] #[]안의 문자열과 공백이 없어서 에러
if[ “$1” = “bin” ] #if와 [ 사이에 공백이 없어서 에러
문자열 비교
filename=$1
if [ -z “$filename” ]; then #변수 filename이 빈 문자열이면 default.dat을 대입
filename=”default.dat”
fi
연산자 | 내용 |
str1 = str2 | str1과 str2가 같은 |
str1 != str2 | str1과 str2가 같은 않음 |
-n str1 | str1이 빈 문자열이 아님 |
-z str1 | str1이 빈 문자열임 |
정수비교
(정수를 비교하는 연산자는 정수만 다루므로 소수점이 포함되면 에러 발생)
num1=$1
num2=$2
max=$num1
if [ “$num1” -lt “$num2” ]; then
max=$num2
fi
연산자 | 내용 |
int1 -eq int2 | int1과 int2가 같음 (=) |
int1 -ne int2 | int1과 int2가 같지 않음 (!=) |
int1 -lt int2 | int1이 int2보다 작음 (<) |
int1 -le int2 | int1이 int2 이하임 (<=) |
int1 -gt int2 | int1이 int2 보다 큼 (>) |
int1 -ge int2 | int1이 int2 이상임 (>=) |
파일속성
logdir=/home/user/myapp/logs
if [ -d “$logdir” ]; then
echo “로그 디렉터리: $logdir”
else
echo “Path Error: $logdir”
fi
연산자 | 내용 |
-e file | file이 존재함 |
-d file | file이 존재하고 디렉터리임 |
-h file | file이 존재하고 심볼릭 링크임 |
-L file | file이 존재하며 심볼릭 링크임(h와 동일) |
-f file | file이 존재하고 일반 파일임 |
-r file | file이 존재하며, 읽기 권한이 부여되어 있음 |
-w file | file이 존재하며, 쓰기 권한이 부여되어 있음 |
-x file | file이 존재하며, 실행 권한이 부여되어 있음 |
file1 -nt file2 | file1의 변경 시각이 file2보다 최근임 |
file1 -ot file2 | file1의 변경 시각이 file2보다 오래됨 |
연산자 결합
# 대상이 디렉터리이면서 읽기 권한이 있으면 참
if [ -d “$datadir” -a -r “$datadir” ]; then
연산자 | 내용 |
조건식1 -a 조건식2 | 조건식1과 조건식2가 모두 참이면 참 |
조건식1 -o 조건식2 | 조건식1과 조건식2 중 하나 이상 참이면 참 |
! 조건식 | 조건식1 진위값의 반대 |
() | 조건식 그룹화 |
&&와 ||
&&: 명령어1이 정상 종료하여 0이 반환된 경우 명령어2가 실행
(파일이 존재하면 cat 명령어를 실행)
$ [ -f file.txt ] && cat file.txt
||: 명령어1이 비정상 종료하여 1이 반환된 경우 명령어2가 실행
(파일이 존재하지 않으면 touch로 만들기)
$ [ -f file.txt ] || touch file.txt
미야케 히데아키, 오스미 유스케 지음|이동규 옮김, 길벗, 모두의 리눅스. 351-365 참조