셸 프로 그래 밍 조건 테스트

셸 프로 그래 밍 에 서 는 if 문 구 를 사용 할 때 항상 조건 에 대한 판단 과 관련된다.다음은 조건 판단 의 여러 가지 상황 을 논의 하 겠 습 니 다.
1. 조건 은 문장
예 를 들 어 디 렉 터 리 에 sam 시작 파일 이 있 을 때 hi, it 's here 를 출력 합 니 다.
if ls sam* &> /dev/null; then
    echo "Hi,it's here."
fi

조건 이 구문 일 때 if 뒤 를 직접 따 르 고 문장 이 성공 하면 0 으로 돌아 가 진실 을 표시 한 다음 에 구문 블록 에 있 는 문 구 를 실행 합 니 다.
다시 한 번 예 를 들 어, 이 컴퓨터 에 hive 사용자 가 있 는 지, 있 으 면 hive 의 uid 와 bash 형식 을 표시 합 니 다.
if grep "^hive" /etc/passwd; then
    grep "^hive" /etc/passwd | cut -d: -f1,3,7
fi

2. 조건 이 변수 판단 일 때
즉, 특정한 변수 가 특정한 조건 에 부합 되 는 지 판단 할 때 판단 문 구 는 다음 과 같은 세 가지 유형 이 있다.
[ expression ]
` expression `
test expression
변수 유형 에 따라 다음 과 같은 몇 가지 상황 으로 나 누 어 토론 합 니 다.
(1) 정수 테스트
변수 가 정수 일 때 [expression] 이라는 형식의 문 구 를 선택 할 수 있 습 니 다.
expression 은 이렇게 쓸 수 있 습 니 다: 수치 1 비교 기호 수치 2 ($A 비교 기호 $B)
비교 기 호 는 다음 과 같다.
크기: - lt, 예 를 들 어 $A - gt $B
크 거나 같 음: - ge
같다
작 음: - lt
작 거나 같 음: - le
아니오
예 를 들 어 봅 시다.
예 1;스 크 립 트 를 쓰 고 두 개의 무 작위 수 를 생 성하 여 크기 를 비교 합 니 다.큰 숫자 보이 기;
bash 에 내 장 된 변수 가 있 습 니 다: $RANDOM
#!/bin/bash
#
A=$RANDOM
B=$RANDOM
if [ $A -ge $B ]; then
  echo "Max number is $A."
else
  echo "Max number is $B."
fi

예 2: 스 크 립 트 를 쓰 고 정 수 를 무 작위 로 생 성하 여 판정 하여 패 리 티 를 표시 합 니 다.
#!/bin/bash
#
A=$RANDOM
if [ $[$A%2] -eq 0 ]; then
  echo "$A: Even"
else
  echo "$A: Odd"
fi

(2) 문자 테스트
변수 가 문자 일 때 문자 테스트 를 합 니 다.
bash 문자 테스트 시 왼쪽 에서 오른쪽으로 문자 비교
>: 보다 크다
<:>
= =: 같 음 (앞의 세 가지 형식 은 모두 [expression])
= ~: 왼쪽 문자열 이 오른쪽 패턴 에 일치 하 는 지 판단 합 니 다. 보통 'expression' 에 사 용 됩 니 다.
[[$opt 1 = ~ $opt 2]] 보통 행 수, 행 미 닻 을 짓 고 따옴표 를 붙 이지 않 습 니 다.
단일 항목:
- z $STRING: 비어 있 으 면 진실 이 고, 비어 있 지 않 으 면 가짜 입 니 다.
- n $STRING: 비어 있 으 면 가짜 이 고, 비어 있 지 않 으 면 진짜 입 니 다.
예 1: 스 크 립 트 를 써 서 사용자 의 셸 이 bash 인지 아 닌 지 를 판정 합 니 다.
#!/bin/bash
#
Shell=`grep "^$1:" /etc/passwd | cut -d: -f7`
if [ -z $Shell ]; then
    echo "No such user or User's shell is null."
    exit 10
fi
if [ "$Shell" == "/bin/bash" ]; then
    echo "Bash User."
    Ret=0
else
    echo "Not Bash User."
    Ret=9
fi
exit $Ret

예 2: 매개 변 수 를 통 해 스 크 립 트 에 문자열 을 전달 합 니 다. 문자열 이 "memory"또는 "Memory"이면 현재 호스트 의 메모리 정 보 를 MB 단위 로 표시 합 니 다.
#!/bin/bash
#
if [[ $1 =~ [Mm]emory$ ]]; then
  free -m
else
  cat /proc/uptime
fi

(3) 파일 테스트
변수 가 파일 경로 나 디 렉 터 리 경로 일 때 존재 여 부 를 판단 하고 일반 파일 인지 아 닌 지 등 은 파일 테스트 가 필요 합 니 다.
연산 자 파일 경로
- f: 일반 파일 인지, 즉 ls - l 일 때 파일 형식 이 - 인 파일 인지 테스트 합 니 다.
- d: 디 렉 터 리 파일 인지, 즉 ls - l 일 때 파일 형식 이 d 인 파일 인지 테스트 합 니 다.
- e: 파일 이 존재 하 는 지 테스트 합 니 다. 존재 하 는 것 이 사실 입 니 다. 그렇지 않 으 면 가짜 입 니 다.
- r: 현재 사용자 에 게 파일 을 읽 을 수 있 는 지 테스트 합 니 다.
- w: 현재 사용자 에 게 파일 을 쓸 수 있 는 지 테스트 합 니 다.
- x: 현재 사용자 에 게 파일 이 실 행 될 수 있 는 지 테스트 합 니 다.
- s: 파일 크기 가 비어 있 지 않 은 지, 비어 있 지 않 으 면 진짜 이 고, 비어 있 으 면 가짜 인지 테스트 합 니 다.
예 1:
스 크 립 트 쓰기: 인 자 를 받 아들 일 수 있 습 니 다. 사용 형식 은 다음 과 같 습 니 다.
script.sh {start|stop|restart|status}
인자 가 start 이면 빈 파일/var/lock/subsys/script 을 만 들 고 "Starting script successfully."를 표시 합 니 다.
인자 가 stop 이면 파일/var/lock/subsys/script 을 삭제 하고 "Stop script finished."를 표시 합 니 다.
인자 가 restart 이면 파일/var/lock/subsys/script 을 삭제 하고 다시 만 들 고 'Restarting script successfully.' 를 표시 합 니 다.
인자 가 status 라면:
/var/lock/subsys/script 파일 이 존재 하면 'script is running' 으로 표 시 됩 니 다.
그렇지 않 으 면 'script is stopped' 로 표 시 됩 니 다.
다른 모든 인자: "script. sh {start | stop | restart | status}"를 표시 합 니 다.
추가: start 의 메커니즘 을 수정 합 니 다.
인자 가 start 이 고/var/lock/subsys/script 파일 이 존재 하지 않 으 면 빈 파일/var/lock/subsys/script 을 만 들 고 "Starting script successfully."를 표시 합 니 다.
그렇지 않 으 면 "script is already running"을 표시 합 니 다.
더 나 아가: stop 의 메커니즘 을 다음 과 같이 수정 합 니 다.
인자 가 stop 이 고/var/lock/subsys/script 파일 이 존재 하면 파일/var/lock/subsys/script 을 삭제 하고 "Stop script finished."를 표시 합 니 다.
그렇지 않 으 면 "script is stopped yet"를 표시 합 니 다.
#!/bin/bash
#
SvcName=`basename $0`
LockFile="/var/lock/subsys/$SvcName"
if [ $# -lt 1 ]; then
  echo "Usage: $SvcName {start|stop|restart|status}"
  exit 3
fi
if [ $1 == 'start' ]; then
  if [ -e $LockFile ]; then
    echo "$SvcName is running."
  else
    touch $LockFile &> /dev/null
    echo "Starting $SvcName successfully."
  fi
elif [ $1 == 'stop' ]; then
  if [ -e $LockFile ];then
    rm -f $LockFile &> /dev/null
    echo "Stopping $SvcName finished."
  else
    echo "$SvcName is stopped yet."
  fi
elif [ $1 == 'restart' ]; then
  rm -f $LockFile &> /dev/null
  touch $LockFile &> /dev/null
  echo "Restarting $SvcName successfully."
elif [ $1 == 'status' ]; then
  if [ -e $LockFile ]; then
    echo "$SvcName is running."
  else
    echo "$SvcName is stopped."
  fi
else
  echo "Usage: $SvcName {start|stop|restart|status}"
  exit 4
fi

3. 조건 부 판단 의 조합 부호
판단 조건 이 하나 가 아니 라 조합 부 를 사용 해 야 한다.
- a 와
- o. 양쪽 조건 이 하나만 충족 하면 된다 는 뜻
! 아니오, 뒤의 조건 과 반대 입 니 다.
예 1: 숫자 를 입력 하 십시오. 1 보다 크 고 100 보다 작 으 면 "available"를 출력 합 니 다. 그렇지 않 으 면 "invalid input"을 출력 합 니 다.
#!/bin/bash
read -p "please input a number: " num
if [ $num -gt 1 -a $num -lt 100 ];then
    echo "available"
else
    echo "invalid input"
fi

4. 단락 연산 자
단락 작업: 전반 에 최종 결 과 를 결정 할 수 있 으 면 후반 부 는 더 이상 연산 하지 않 습 니 다.
연산:
가짜 & & {진짜 | 가짜} = 가짜
또는 연산:
진짜 | | (진짜, 가짜) = 진짜
예 1: 디 렉 터 리/tmp/test 가 존재 하 는 지, 존재 하지 않 는 지 판단 하려 면 이 디 렉 터 리 를 새로 만 들 고 존재 하면 "derctory exists"를 출력 합 니 다.
[ -d /tmp/test ] || mkdir /tmp/test && echo "directory exists"

좋은 웹페이지 즐겨찾기