25_Shell 언어 - if 조건 판단 의 조합 판단 (과, 또는, 비) 과 다 분기 if 문

1. 조합 조건 판단
조합 조건 테스트 는 여러 조건 을 조합 하여 판단 할 수 있 고 조건 과 조건 간 에 논리 적 인 관 계 를 가 진 다 는 것 을 말한다.예 를 들 어 하나의 수가 3 보다 크 고 9 보다 작 는 지 판단 하 는데 여기 가 3 보다 큰 것 은 하나의 조건 이 고 9 보다 작은 것 도 하나의 조건 이 므 로 이 두 가지 조건 은 반드시 동시에 만족 해 야 한다.동시에 만족 하 는 것 은 논리 적 관계 이다.일반적으로 논리 관 계 는 다음 과 같은 몇 가지 가 있다.
와: - a, 여러 조건 을 지정 할 때 기본 값 은 관계 입 니 다.
혹은
비:!이것 은 단일 항목 조작 부호 이다.
 
UID 가 1 보다 크 고 499 보다 작은 지 판단 하 는 방법 은 다음 과 같 습 니 다.
[root@localhost tutor]# Uid=300
[root@localhost tutor]# [ $Uid -ge 1 ]
[root@localhost tutor]# echo $?
0

[root@localhost tutor]# [ $Uid -le 499 ]
[root@localhost tutor]# echo $?
0

[root@localhost tutor]# [ $Uid -ge 1 -a $Uid -le 499 ]
\# 사용 - a 는 두 가지 관계 의 조건 을 동시에 만족 시 켜 야 함 을 나타 낸다.
[root@localhost tutor]# echo $?
0

[root@localhost tutor]# Uid=3000
[root@localhost tutor]# [ $Uid -ge 1 -a $Uid -le 499 ]
[root@localhost tutor]# echo $?
1

UID 가 0 인지, 아니면 그 이상 인지 판단 하 는 방법 은 다음 과 같 습 니 다.
[root@localhost tutor]# Uid=300
[root@localhost tutor]# [ $Uid -eq 0 -o $Uid -ge 500 ]
\# 사용 - o 는 두 개 또는 관 계 를 나타 내 는 조건 으로 하나만 만족 시 키 면 됩 니 다.
[root@localhost tutor]# echo $?
1

[root@localhost tutor]# Uid=3000
[root@localhost tutor]# [ $Uid -eq 0 -o $Uid -ge 500 ]
[root@localhost tutor]# echo $?
0

UID 가 0 과 같 지 않 은 지 판단 합 니 다. 쓰 는 방법 은 다음 과 같 습 니 다.
[root@localhost tutor]# Uid=0
[root@localhost tutor]# [ ! $Uid -eq 0 ]
\# 사용!이것 은 Uid 가 0 과 같다 는 판단 결 과 를 반대 하 는 것 을 나타 낸다. 즉, Uid 가 0 과 같 지 않다 는 것 이다.
[root@localhost tutor]# echo $?
1

[root@localhost tutor]# [ $Uid -ne 0 ]
\# 여기 서 Uid 가 0 인지 아 닌 지 판단 합 니 다.
[root@localhost tutor]# echo $?
1

 
예. 스 크 립 트 를 작성 하고 매개 변 수 를 통 해 스 크 립 트 에 문자열 을 전달 합 니 다. 전 달 된 문자열 이 "memory"또는 "Memory"이면 현재 호스트 의 메모리 정 보 를 MB 단위 로 표시 합 니 다.그렇지 않 으 면/proc/uptime 파일 의 내용 을 표시 합 니 다.
[root@localhost tutor]# vim memory1.sh
#!/bin/bash
if [ $1 =="memory" -o $1 == "Memory" ]; then
#            ,   -o            
        free -m
else
        cat /proc/uptime
fi

[root@localhost tutor]# bash -x memory1.sh memory
+ '[' memory== memory -o memory == Memory ']'
+ free -m
             total       used       free    shared    buffers     cached
Mem:           996        511        484         0         57        160
-/+buffers/cache:        293        702
Swap:         2015          0       2015

[root@localhost tutor]# bash -x memory1.sh Memory
+ '[' Memory== memory -o Memory == Memory ']'
+ free -m
             total       used       free    shared    buffers     cached
Mem:           996        511        484        0         57        160
-/+buffers/cache:        293        702
Swap:         2015          0       2015

[root@localhost tutor]# bash -x memory1.sh abc
+ '[' abc ==memory -o abc == Memory ']'
+ cat/proc/uptime
50889.6250151.85

 
위의 논리 관 계 는 조건 조합의 상황 에 대해 두 개 또는 여러 명령 의 운행 결과 도 조합 하여 판단 할 수 있 는데 그 논리 관 계 는 다음 과 같은 몇 가지 가 있다.
& &: 와
| |: 또는
!: ... 이 아니다
UID 가 GID 와 같 으 면 'Good Guy' 로 표시 하고, 그렇지 않 으 면 'BadGuy' 로 표시 하고, 존재 하지 않 으 면 스 크 립 트 를 종료 합 니 다.
[root@localhost tutor]# vim if_user_lg.sh
#!/bin/bash
 
if ! id $1&> /dev/null; then
#        if         ,    !             
        echo "No such user."
        exit 6
fi
 
if [ `id -u$1` -eq `id -g $1` ]; then
        echo "Good Guy"
else
        echo "Bad Guy"
fi

[root@localhost tutor]# bash -x if_user_lg.sh root
+ id root
++ id -u root
++ id -g root
+ '[' 0 -eq 0']'
+ echo 'GoodGuy'
Good Guy

[root@localhost tutor]# echo $?
0

[root@localhost tutor]# bash -x if_user_lg.sh roott
+ id roott
+ echo 'Nosuch user.'
No such user.
+ exit 6

[root@localhost tutor]# echo $?
6

 
다 분기 if 구문
앞에서 언급 한 조건 판단 문 구 는 한 갈래 와 두 갈래 만 있 는 상황 이 고 사실은 bash 도 여러 갈래 의 조건 판단 을 지원 합 니 다. 여러 갈래 의 if 문 구 는 두 갈래 if 문 구 를 확장 하 는 것 입 니 다.다 중 분기 if 문 구 는 여러 개의 if 조건 을 제공 하지만 그 중의 한 문장 만 실행 합 니 다. 그 문법 형식 은 다음 과 같 습 니 다.
if 조건 1;then
문장 1
문장 2
...
elif 조건 2;then
문장 1
문장 2
...
elif 조건 3;then
문장 1
문장 2
...
else
문장 1
문장 2
...
fi
 
다 분기 조건문 의 사용 방법 을 예 로 들 어 보 겠 습 니 다.
 
예 1. 스 크 립 트 작성: 현재 호스트 의 CPU 생산 업 체 를 판단 합 니 다. 그 정 보 는/proc/cpu info 파일 에서 vendor id 줄 에 있 습 니 다.생산 업 체 가 GenuineIntel 이면 Intel 회사 로 표 시 됩 니 다.생산 업 체 가 AuthenticAMD 라면 AMD 회사 로 표 시 됩 니 다.
그렇지 않 으 면 식별 할 수 없 음 을 나타 낸다.
 
[root@localhost tutor]# vim if_cpu1.sh
#!/bin/bash
#
Vendor=`grep"vendor_id" /proc/cpuinfo | uniq | cut -d: -f2`
 
if [[ $Vendor=~ [[:space:]]*GenuineIntel$ ]]; then
        echo "intel"
elif [[$Vendor =~ [[:space:]]*AuthenticAMD$ ]]; then
#    elif        AMD
        echo "AMD"
else
        echo "Unknown"
fi

 
[root@localhost tutor]# bash -x if_cpu1.sh
++ cut -d: -f2
++ uniq
++ grepvendor_id /proc/cpuinfo
+ Vendor='GenuineIntel'
+ [[  GenuineIntel =~ [[:space:]]*GenuineIntel$ ]]
+ echo intel
intel

 
예 2. 매개 변 수 를 통 해 스 크 립 트 에 문자열 을 전달 합 니 다. 예 를 들 어 Fedora, Gentoo, Redhat 는 Linux 발행 판 에서 처리 하 는 주류 발행 시 리 즈 를 판단 합 니 다. fedora, centos, redhat 이면 RedHat 을 표시 합 니 다.suse, opensuse 라면 SUSE 로 표시 합 니 다.ubuntu, mint 라면, debian, 데 비 안 으로 표시 하기;그렇지 않 으 면 다른 것 으로 표시 합 니 다.
 
[root@localhost tutor]# vim version.sh
#!/bin/bash
#
if [ $1 =="fedora" -o $1 == "centos" -o $1 == "redhat" ];then
        echo "RedHat"
elif [ $1 =="suse" -o $1 == "opensuse" ]; then
        echo "SUSE"
elif [ $1 =="ubuntu" -o $1 == "mint" -o $1 == "debian" ];then
        echo "Debian"
else
        echo "Others"
fi

[root@localhost tutor]# bash version.sh redhat
RedHat

[root@localhost tutor]# bash version.sh mint
Debian

[root@localhost tutor]# bash version.sh opensuse
SUSE

[root@localhost tutor]# bash version.sh abc
Others

 
예 3. 다른 스 크 립 트 를 만 들 수 있 는 스 크 립 트 를 작성 합 니 다. 이 스 크 립 트 는 세 개의 인 자 를 받 아들 여야 합 니 다. 마지막 인 자 는 파일 이름 이지 만 인 자 는 변 할 수 있 습 니 다.
          script.sh  -a abc /u01/scripts/test1.sh
          script.sh  -d 2013-07-19 /u01/scripts/test1.sh
          script.sh  -D 'some infomation' /u01/scripts/test1.sh
이 스 크 립 트 는/u01/scripts/test 1. sh 파일 을 만 들 수 있 으 며, - a abc 를 제시 하면 파일 앞의 두 행동 을 합 니 다.
#!/bin/bash
# Author:abc
- d 2014 - 07 - 23 을 제시 하면 파일 앞의 두 가지 행동:
#!/bin/bash
# Date: 2013-07-23
- D "someinfomation"을 제시 하면 파일 앞의 두 행동:
#!/bin/bash
#Description: some infomation
다른 모든 매개 변 수 는 오 류 를 알 리 고 종료 합 니 다.
 
다음은 이 스 크 립 트 의 첫 번 째 버 전 입 니 다.
——————————————————————————————————
[root@localhost ~]# vim mkscript
#!/bin/bash
#
if [ $# -ne 3]; then
        echo "the number of arguements iswrong."
        exit 4
fi
 #        3   
 
echo'#!/bin/bash' >> $3
     #     ,             ,  ”#!/bin/bash”        
 
if [ $1 =='-a' ]; then
        echo "# Author: $2" >>$3
#          -a,           ,        
elif [ $1 =='-d' ]; then
        echo "# Date: $2" >> $3
#          -d,           ,        
elif [ $1 =='-D' ]; then
        echo "# Description: $2">> $3
#          -D,           ,        
else
        echo "Unkown Option, ignoreit."
        rm -f $3
 #        $3    ,          ,         ,      
 exit 5
fi
 
vim + $3
#          ,  vim    ,    vim             ,
#          ,         
if bash -n $3> /dev/null; then
#       $3                ,          
        chmod +x $3
else
        echo "Sytax wrong in $3."
#        ,     
fi

——————————————————————————————————
스 크 립 트 는 여기까지 만 들 어 졌 습 니 다. 필요 한 기능 이 완성 되 었 는 지 확인 하기 위해 서 이 스 크 립 트 를 실행 하 겠 습 니 다.
[root@localhost ~]# chmod +x mkscript
[root@localhost ~]# bash -n mkscript
[root@localhost ~]# ./mkscript/tmp/a.sh
the number ofarguements is wrong.
#         ,       

[root@localhost ~]# ./mkscript -a mickey/tmp/a.sh
\# 3 개의 인 자 를 전달 하면 스 크 립 트 가 성공 적 으로 실 행 됩 니 다.
[root@localhost ~]# cat/tmp/a.sh
#!/bin/bash
# Author:mickey
#   /tmp/a.sh           

[root@localhost ~]# ./mkscript -d 2014-07-24/tmp/b.sh
[root@localhost ~]# cat/tmp/b.sh
#!/bin/bash
# Date:2014-07-24

[root@localhost ~]# ./mkscript -D "Toy Program"/tmp/c.sh
[root@localhost ~]# cat/tmp/c.sh
#!/bin/bash
# Description:Toy Program

[root@localhost ~]# ./mkscript -m hello/tmp/d.sh
Unkown Option,ignore it.
#         ,           

[root@localhost ~]# ls/tmp
a.sh c.shkeyring-Xi9NCS  orbit-gdm  pulse-uP5T8Y6V6nIN  virtual-root.nBhtJw virtual-root.q9Sgpu  yum.log
b.sh keyring-bgxXAq keyring-xva5ss  orbit-root  pulse-yCmeAwocSW1U  virtual-root.plTHoO  irtual-root.rQ0Eab
#      /tmp/d.sh    ,         

[root@localhost ~]# ./mkscript -a mickey/tmp/a.sh
#!/bin/bash
# Author:hello
~                                                                                                                             
~
#          ,             

[root@localhost ~]# ./mkscript -D "Syntax test"/tmp/e.sh
#!/bin/bash
# Description:Syntax test
 
if [ $1 -eq 0]; then
        echo Hello
 
~                                                                                                                             
~                                                                                                                              
#     fi,                   。
/tmp/e.sh:line 7: syntax error: unexpected end of file
Sytax wrong in/tmp/e.sh.

[root@localhost ~]# ./mkscript -D "Syntax right"/tmp/f.sh
#!/bin/bash
# Description:Syntax right
if [ $1 -eq 0]; then
        echo hello
else
        echo world
fi
#            ,                 

[root@localhost ~]# ls -l/tmp/f.sh
-rwxr-xr-x. 1 root root 94 Jul 12 07:40 /tmp/f.sh
#     f.sh            

[root@localhost ~]#/tmp/f.sh 0
hello
#       /tmp/f.sh    ,      0

 
 

좋은 웹페이지 즐겨찾기