22_셸 언어 - 2 분기 조건 판단 문, 표현 식 판단, 내장

1. 2 분기 조건 판단 문
앞에서 단일 분기 조건 판단 문 구 를 소개 한 적 이 있다. 즉, 스 크 립 트 에서 조건 을 만족 시 키 는 상황 만 판단 하고 조건 을 만족 시 키 지 못 하 는 상황 에 대해 어떠한 조작 도 하지 않 는 다.그러나 실제 개발 에 서 는 조건 이 만족 하지 않 는 경우 통제 가 필요 하 다.이렇게 하면 조건 을 만족 시 키 는 것 도 판단 하고 조건 을 만족 시 키 지 못 하 는 문장 구 조 를 판단 해 야 한다. 이 를 두 가지 조건 판단 문 이 라 고 하 는데 그 구 조 는 다음 과 같다.
if 조건 then
문장 1
문장 2
...
else 
문장 1
문장 2
...
fi
 
2. 2 분기 조건 판단 문 인 스 턴 스 데모 
 
예 1. 앞에서 사용자 가 존재 하 는 지 여 부 를 판단 하 는 스 크 립 트 를 사용 하여 개선 합 니 다. 지정 한 사용자 가 저장 하면 존재 하 는 지 먼저 설명 하고 ID 번호 와 SHELL 을 표시 합 니 다.그렇지 않 으 면 사용 자 를 추가 하고 ID 번 호 를 표시 합 니 다.
 
[root@localhost tutor]# vim if_user3.sh
#!/bin/bash
#
 
UserName=user1
 
if id $UserName &> /dev/null; then
        echo "$UserName exists."
        grep "^$UserName:" /etc/passwd |cut -d: -f3,7
else
        useradd $UserName
        grep "^$UserName:" /etc/passwd |cut -d: -f3
fi

 
[root@localhost tutor]# bash -n if_user3.sh
[root@localhost tutor]# chmod +x if_user3.sh
[root@localhost tutor]# ./if_user3.sh
user1 exists.
500:/bin/bash

[root@localhost tutor]# userdel -r user1
[root@localhost tutor]# ./if_user3.sh
500

[root@localhost tutor]# bash -x if_user3.sh
#           
+ UserName=user1
+ id user1
+ echo 'user1 exists.'
user1 exists.
+ cut -d: -f3,7
+ grep '^user1:' /etc/passwd
500:/bin/bash

 
예 2. 스 크 립 트 를 작성 하여 다음 과 같은 기능 을 수행 합 니 다. 장치/dev/sdb 3 가 마 운 트 되 어 있 으 면 마 운 트 지점 을 표시 합 니 다.그렇지 않 으 면 마 운 트 되 지 않 았 거나 장치 가 존재 하지 않 는 다 는 것 을 의미한다.
[root@localhost tutor]# vim mount_point2.sh
#!/bin/bash
 
Device='/dev/sdb3'
 
if mount | grep "^$Device" &> /dev/null; then
        mount | grep "^$Device" |cut -d' ' -f3
else
        echo "$Device is not mounted or does not exist."
fi

 
[root@localhost tutor]# bash -n mount_point2.sh
[root@localhost tutor]# chmod +x mount_point2.sh
[root@localhost tutor]# bash -x mount_point2.sh
+ Device=/dev/sdb3
+ grep '^/dev/sdb3'
+ mount
+ cut '-d ' -f3
+ grep '^/dev/sdb3'
+ mount
/mydata

 
3. 비 독립 명령 을 판단 조건 으로 하 는 문구
지금까지 어구 집행 상태 (불 값) 를 판단 조건 으로 해 왔 으 나 많은 상황 에서 판단 조건 은 집행 성공 여 부 를 근거 로 하지 않 았 다. 예 를 들 어 두 값 의 크기 를 판단 하려 면 a 가 b 보다 크 면 문장 1 을 집행 하고 그렇지 않 으 면 집행 문 2 를 판단 해 야 한다.이 경우 bash 표현 식 테스트 가 필요 합 니 다.
[ expression ]
[[ expression ]]
test expression
bash 의 조건 테스트 는 주로 다음 과 같은 세 가지 가 있 습 니 다.
정수 테스트: 두 정수 가 누가 크 고 누가 작 으 며 똑 같은 지 비교 합 니 다.
문자 테스트: 두 문자열 이 같은 지 비교 하기;
파일 테스트: 어떤 파일 이 읽 기 권한, 쓰기 권한, 실행 권한 이 있 는 지 테스트 합 니 다.
정수 테스트 의 형식 은:
expression: 수치 1 비교 기호 수치 2
이로써 $A 비교 기호 $B 예:
이상: $A -gt $B
$A -ge $B
같 음: $A -eq $B
다음 보다 작 음: $A -lt $B
작 거나 같 음: $A -le $B
같 지 않 음: $A -ne $B
다음은 정수 테스트 의 사용 방법 을 예 로 들 어 보 겠 습 니 다.
예 1. 스 크 립 트 를 작성 하고 두 개의 무 작위 수 를 생 성하 여 크기 를 비교 합 니 다. 큰 수 를 표시 합 니 다.
 
Bash 에 내 장 된 변 수 는 무 작위 수 를 생 성 하 는 데 사 용 됩 니 다. $RANDOM, 이 변 수 는 0 - 32767 사이 의 값 을 생 성하 기 때문에 다음 과 같은 작업 을 할 수 있 습 니 다.
[root@localhost tutor]# vim maxnum.sh
#!/bin/bash
#
A=$RANDOM
B=$RANDOM
 
if [ $A -ge $B ]; then
#            : [[ $A -ge $B ]]   test $A -ge $B
        echo "Max number is $A"
else
        echo "Max number is $B"
fi

[root@localhost tutor]# bash -n maxnum.sh 
[root@localhost tutor]# bash -x maxnum.sh
+ A=13623
+ B=27110
+ '[' 13623 -ge 27110 ']'
+ echo 'Max number is 27110'
Max number is 27110

 
예 2. 스 크 립 트 를 작성 하여 정 수 를 무 작위 로 생 성하 여 패 리 티 를 판단 하고 표시 합 니 다.
하나의 정수 의 패 리 티 를 판단 할 때 이 정 수 를 2 로 나 누 어 나머지 를 얻 을 수 있 고 나머지 는 1 로 홀수 이 며 나머지 는 0 으로 짝수 이 며% (모 연산) 를 사용 하면 나머지 를 판단 할 수 있 기 때문에 다음 과 같은 조작 을 할 수 있다.
 
[root@localhost tutor]# vim if_even_odd.sh
#!/bin/bash
#
A=$RANDOM
 
Res=$[$A%2]
if [ $Res -eq 0 ]; then
#        ,      [ $[$A%2] -eq 0 ]; then
        echo "$A: Even"
else
        echo "$A: Odd"
fi

[root@localhost tutor]# bash -n if_even_odd.sh
[root@localhost tutor]# bash -x if_even_odd.sh
+ A=19891
+ Res=1
+ '[' 1 -eq 0 ']'
+ echo '19891: Odd'
19891: Odd

 
예 3. UID 가 GID 와 같다 면 사용 자 를 지정 하 는 것 은 "Good"입 니 다. Guy ", 그렇지 않 으 면"Bad "로 표 시 됩 니 다. Guy”.
[root@localhost tutor]# vim guy.sh
#!/bin/bash
#
UserName=user1
 
if [ `id -u $UserName` -eq `id -g $UserName` ]; then
        echo "Good Guy."
else
        echo "Bad Guy."
fi

[root@localhost tutor]# bash -n guy.sh
[root@localhost tutor]# bash -x guy.sh
+ UserName=user1
++ id -u user1
++ id -g user1
+ '[' 500 -eq 500 ']'
+ echo 'Good Guy.'
Good Guy.

 
예 4. 사용자 에 게 주어진 ID 번호 가 499 보다 크 면 일반 사용자 임 을 설명 합 니 다. 그렇지 않 으 면 관리자 나 시스템 사용자 임 을 설명 합 니 다.
[root@localhost tutor]# vim if_user4.sh
#!/bin/bash
#
UserName=user1
 
if [ `id -u $UserName` -gt 499 ]; then
#          ,               ,            ,        
        echo "A common user: $UserName."
else
        echo "Admin user or system user: $UserName."
fi

 
[root@localhost tutor]# bash -n if_user4.sh
[root@localhost tutor]# bash -x if_user4.sh
+ UserName=user1
++ id -u user1
+ '[' 500 -gt 499 ']'
+ echo 'A common user: user1.'
A common user: user1.

[root@localhost tutor]# bash -x if_user4.sh
#         daemon,         
+ UserName=daemon
++ id -u daemon
+ '[' 2 -gt 499 ']'
+ echo 'Admin user or system user: daemon.'
Admin user or system user: daemon.

 
포 함 된 문장
또한 위의 예 입 니 다. 사용자 이름 을 daemon 2 로 바 꾸 고 이 사용자 가 존재 하지 않 으 면 실행 할 때 논리 적 오류 (비 문법 오류) 가 발생 할 수 있 으 므 로 사용자 가 존재 하 는 지 여 부 를 먼저 판단 해 야 합 니 다.
[root@localhost tutor]# bash -x if_user4.sh
+ UserName=daemon2
++ id -u daemon2
id: daemon2: No such user
#      ,    
+ '[' -gt 499 ']'
if_user4.sh: line 5: [: -gt: unary operator expected

 
여기 서 먼저 사용자 의 존재 여 부 를 판단 하고 존재 한다 면 사용자 의 UID 가 499 보다 큰 지 여 부 를 판단 해 야 합 니 다. 이렇게 다 층 적 으로 판단 하면 내장 이 라 고 합 니 다.
[root@localhost tutor]# vim if_user4.sh
#!/bin/bash
#
UserName=daemon2 
if id $UserName &> /dev/null; then
#     ,          ,       UID    499
        if [ `id -u $UserName` -gt 499 ]; then
                echo "A common user: $UserName."
        else
                echo "Admin user or system user: $UserName."
        fi
else
        echo "$UserName is not exist."
fi

[root@localhost tutor]# bash -x if_user4.sh
+ UserName=daemon2
+ id daemon2
+ echo 'daemon2 is not exist.'
daemon2 is not exist.

 포 함 된 문 구 는 if 에 만 국한 되 는 것 이 아니 라 사실상 for 순환 문 구 는 if 문 구 를 포함 할 수 있 으 며, if 문 구 는 for 순환 문 구 를 포함 할 수 있 습 니 다.
예. 200 이내 의 모든 3 의 정수 배 를 구 하 는 정수 의 합:
3 의 정수 배 를 찾 으 려 면 이 수 를 3 으로 나 눌 수 있 습 니 다. 나머지 가 0 이면 3 의 정수 배 이기 때문에 for 문 구 를 사용 하여 if 문 구 를 끼 워 넣 을 수 있 습 니 다.
 
[root@localhost tutor]# vim 3sum.sh
#!/bin/bash
#
Sum=0
for I in {1..200}; do
        if [ $[$I%3] -eq 0 ]; then
                Sum=$[$Sum+$I]
        fi
done
 
echo "Sum: $Sum"

[root@localhost tutor]# bash -n 3sum.sh
[root@localhost tutor]# bash 3sum.sh
Sum: 6633

좋은 웹페이지 즐겨찾기