카테고리 보관물: OS

Operating System

shell if문

#! /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 = str2str1과 str2가 같은
str1 != str2str1과 str2가 같은 않음
-n str1str1이 빈 문자열이 아님
-z str1str1이 빈 문자열임

정수비교
(정수를 비교하는 연산자는 정수만 다루므로 소수점이 포함되면 에러 발생)
num1=$1
num2=$2
max=$num1
if [ “$num1” -lt “$num2” ]; then
max=$num2
fi

연산자내용
int1 -eq int2int1과 int2가 같음 (=)
int1 -ne int2int1과 int2가 같지 않음 (!=)
int1 -lt int2int1이 int2보다 작음 (<)
int1 -le int2int1이 int2 이하임 (<=)
int1 -gt int2int1이 int2 보다 큼 (>)
int1 -ge int2int1이 int2 이상임 (>=)

파일속성
logdir=/home/user/myapp/logs
if [ -d “$logdir” ]; then
echo “로그 디렉터리: $logdir”
else
echo “Path Error: $logdir”
fi

연산자내용
-e filefile이 존재함
-d filefile이 존재하고 디렉터리임
-h filefile이 존재하고 심볼릭 링크임
-L filefile이 존재하며 심볼릭 링크임(h와 동일)
-f filefile이 존재하고 일반 파일임
-r filefile이 존재하며, 읽기 권한이 부여되어 있음
-w filefile이 존재하며, 쓰기 권한이 부여되어 있음
-x filefile이 존재하며, 실행 권한이 부여되어 있음
file1 -nt file2file1의 변경 시각이 file2보다 최근임
file1 -ot file2file1의 변경 시각이 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 참조