21_Shell 언어 ― 조건 판단 1 의 실행 상태 반환 값, 단일 분기 조건 판단 문

1. 실행 문 개술 선택
프로 세 스 를 대상 으로 하 는 프로그램의 프로 세 스 제어 구 조 는 주로 세 가지 가 있다. 1. 순서대로 실행 하기;2. 순환 실행;3. 실행 을 선택 하 십시오.앞에서 순환 집행 을 소 개 했 고 본 장과 후속 장 은 이런 구 조 를 선택 하여 집행 하 는 것 을 중점적으로 소개 할 것 이다.
선택 집행 이란 프로그램 이 실행 하 는 과정 에서 지 정 된 조건 을 만족 시 키 면 그 중의 일부분 을 집행 하고 그렇지 않 으 면 다른 내용 을 집행 하 는 것 을 말한다. 즉, 선택 적 인 실행 테스트 조건 과 관련 된 내용 일 뿐이다.
사용자 user 1 을 추가 하려 면 useradd 를 사용 할 수 있 습 니 다. user 1 로 이 루어 집 니 다.그러나 user 1 사용자 가 이미 존재 한다 면 useradd 를 실행 합 니 다. user 1 시 에 잘못 보고 합 니 다.이 를 피하 기 위해 서 는 실행 전에 user 1 이 존재 하 는 지 테스트 해 야 한다.그 과정 은 다음 과 같다.
 
조건 이 만족 하면:
"사용자 가 이미 존재 합 니 다. 추가 할 필요 가 없습니다"를 표시 합 니 다.
만약 조건 이 만족 하지 않 는 다 면:
사용자 추가.
 
조건 만족 과 조건 이 만족 하지 않 는 것 은 한 가지 상황 만 있 을 수 있 고 조건 만족 여 부 를 판단 하 는 과정, 즉 선택 조건 테스트 이다.
 
2. 실행 상태 반환 값
 
bash 에서 조건 테스트 를 하 는 방식 은 보통 세 가지 가 있 습 니 다.
1. 쓰다 [ expression ] 
expression (표현 식) 을 만족 시 키 는 지 테스트 한 후 되 돌아 오 는 값 을 얻 을 수 있 습 니 다. 괄호 와 표현 식 사이 에 빈 칸 이 있어 야 합 니 다.
2. 쓰다 [[ expression ]]
첫 번 째 방식 과 유사 하 다. 다른 점 은 하 나 는 명령 이 고 하 나 는 키워드 이다.
3. test expression
표현 식 을 검사 하기 위해 명령 test 를 사용 합 니 다.
조건 테스트 를 실현 할 때 독립 적 으로 실행 할 수 있 는 명령 은 상기 테스트 방식 을 사용 할 필요 가 없다. 상기 테스트 방식 은 일부 전용 테스트 환경 에 만 사용 된다.
 
테스트 조건 의 결 과 를 어떻게 확인 합 니까? bash 에서 명령 실행 이 완료 되면 명령 실행 상태 반환 값 이 발생 합 니 다. 명령 실행 상태 반환 값 은 명령 실행 결과 반환 값 과 대응 하 는 개념 입 니 다. 예 를 들 어:
 
[root@localhost ~]# ls /var
account  cache  crash  cvs  db  empty  games  gdm  lib  local  lock  log  mail  nis  opt  preserve  run  
#     ls /var   ,        /var       ,           。
#                   ? bash        ,               。
#              ,               。

 
Bash 의 변수 유형 은 주로 로 컬 변수, 국부 변수, 환경 변수, 위치 변수 와 특수 변수 가 있 는데 그 중에서 특수 변수 중의 $? 이 변 수 는 수시로 변 합 니 다. 저 장 된 데 이 터 는 방금 실 행 된 명령 상태 반환 값 입 니 다.
 
[root@localhost ~]# echo $?
0
#    $?      ls /var            

 
지금 일부러 한 번 실 수 를 했 습 니 다.
 
[root@localhost ~]# ls /varr
ls: cannot access /varr: No such file or directory
# /varr     ,   ;      “ls: cannot access /varr: No such file or directory”
#       

[root@localhost ~]# echo $?
2
#      $?         ,          

[root@localhost ~]# lss /var
-bash: lss: command not found
# lss      

[root@localhost ~]# echo $?
127
# $?        

 
실행 상태 반환 값 $? 의 숫자 의 미 는:
0: 성공 실행;
1 - 255: 실행 실패.
그 중에서 1, 2, 127 은 시스템 에 의 해 점용 되 었 습 니 다. 사용자 가 실행 상태 반환 값 을 스스로 정의 하려 면 exit 명령 을 사용 하여 스 크 립 트 에서 스 크 립 트 실행 상태 반환 값 을 정의 할 수 있 습 니 다. 정의 되 지 않 으 면 스 크 립 트 실행 상태 반환 값 은 스 크 립 트 실행 이 끝나 기 전에 마지막 으로 실 행 된 문장의 상태 에 달 려 있 습 니 다.
그러므로 bash 문장의 집행 조건 을 판단 하 는 것 은 실행 상태 반환 값 을 판단 하 는 것 이다.
현재 호스트 에 루트 사용자 가 있 는 지 판단 하려 면 다음 작업 을 수행 할 수 있 습 니 다.
[root@localhost ~]# id root
uid=0(root) gid=0(root) groups=0(root)

[root@localhost ~]# echo $?
0
# root    , $?  0

[root@localhost ~]# id roott &> /dev/null
#  id roott         /dev/null 

[root@localhost ~]# echo $?
1
# $?  1,     roott  。

[root@localhost ~]# grep "^root:" /etc/passwd &> /dev/null
[root@localhost ~]# echo $?
0
#   grep         /etc/passwd    “root”    ,     root  

[root@localhost ~]# grep "^roott:" /etc/passwd &> /dev/null
[root@localhost ~]# echo $?
1
# grep      “roott”, $?   1

bash 프로 그래 밍 에서 어떤 조건 이 만족 하 는 지 테스트 하 는 것 도 명령 실행 상태 반환 값 을 통 해 판단 합 니 다.
다시 한 번 예 를 들 어 스 크 립 트 에서 실행 상태의 반환 값 을 스스로 정의 합 니 다.
 
[root@localhosttutor]# vim if_user_exit.sh
#!/bin/bash
#
 
if id $1 &> /dev/null;then
        echo "Exists."
        exit 0
#      ,        0
else
        echo "Not exist."
        exit 8
#      ,        8
fi

[root@localhosttutor]# bash -n if_user_exit.sh
[root@localhosttutor]# bash if_user_exit.sh user1
Exists.

[root@localhosttutor]# echo $?
0

[root@localhosttutor]# bash if_user_exit.sh suse
Not exist.

[root@localhosttutor]# echo $?
8

그러나 주의해 야 할 것 은 스 크 립 트 에 exit 가 나타 나 면 스 크 립 트 가 자동 으로 끝나 고 그 후의 내용 이 실행 되 지 않 기 때문에 exit 는 스 크 립 트 가 끝 날 곳 에 두 어야 합 니 다. 아까 스 크 립 트 끝 에 한 줄 을 추가 하면:
[root@localhosttutor]# vim if_user_exit.sh
#!/bin/bash
#
 
if id $1 &> /dev/null;then
        echo "Exists."
        exit 0
else
        echo "Not exist."
        exit 8
fi
echo "Hello Bash!"

 
[root@localhosttutor]# bash if_user_exit.sh suse
Not exist.
#    ,       echo "Hello Bash!"    。

[root@localhosttutor]# echo $?
8

 
exit 의 값 을 정의 하고 실행 해 야 할 모든 문 구 를 실행 할 수 있 도록 하려 면 상기 스 크 립 트 를 최적화 할 수 있 습 니 다.
[root@localhosttutor]# vim if_user_exit.sh
#!/bin/bash
#
 
if id $1 &> /dev/null;then
        echo "Exists."
        Ret=0
#        Ret       
else
        echo "Not exist."
        Ret=8
fi
echo "Hello Bash!"
exit $Ret
#                Ret

[root@localhosttutor]# bash if_user_exit.sh suse
Not exist.
Hello Bash!
#             

[root@localhosttutor]# echo $?
8
#            Ret

3. 단일 분기 조건 판단 모델
셸 스 크 립 트 프로 그래 밍 에서 실행 을 선택 하 는 방식 은 주로 두 가지 가 있 습 니 다.
1. if 문장
2. case 문장 
여기 서 먼저 if 문장의 용법 을 소개 합 니 다. 그 형식 은 다음 과 같 습 니 다.
if 조건 then
문장 1
문장 2
...
fi
또는:
if 조건.
then
문장 1
문장 2
...
fi
여기 서 if 판단 조건 을 사용 합 니 다. 만족 하면 실행 문 1, 문 2............................................................................
 
4. 단일 분기 조건 판단 문 인 스 턴 스
다음은 이러한 판단 문장의 용법 을 예 로 들 어 보 여 준다.
예 1: 스 크 립 트 를 작성 합 니 다. 사용자 가 존재 하면 이 사용자 가 존재 하 는 것 을 표시 합 니 다. 그렇지 않 으 면 어떠한 조작 도 하지 않 습 니 다.
[root@localhost ~]# vim /u01/tutor/if_user.sh
  
 #!/bin/bash
   
  UserName=user1
  if id $UserName &> /dev/null; then
           echo "$UserName exists."
  fi

 
[root@localhost tutor]# chmod +x if_user.sh
[root@localhost tutor]# ./if_user.sh
user1 exists.

[root@localhost tutor]# tail /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
user1:x:500:500::/home/user1:/bin/bash
# user1    

[root@localhost tutor]# userdel -r user1
#    user1

[root@localhost tutor]# ./if_user.sh
[root@localhost tutor]# bash -x if_user.sh
+ UserName=user1
+ id user1
#         

[root@localhost tutor]# useradd user1
#     user1

[root@localhost tutor]# bash -x if_user.sh
#       
+ UserName=user1
+ id user1
+ echo 'user1 exists.'
user1 exists.

 
쓰다 grep 명령 도 비슷 한 판단 을 할 수 있 습 니 다.
 
[root@localhost tutor]# vim if_user2.sh
#!/bin/bash
#
UserName=user1
 
if grep "^$UserName\>" /etc/passwd &> /dev/null; then
        echo "$UserName exists."
fi

[root@localhost tutor]# bash -n if_user2.sh

[root@localhost tutor]# bash -x if_user2.sh
+ UserName=user1
+ grep '^user1\>' /etc/passwd
+ echo 'user1 exists.'
user1 exists.

[root@localhost tutor]# userdel -r user1
[root@localhost tutor]# bash -x if_user2.sh
+ UserName=user1
+ grep '^user1\>' /etc/passwd

 
fi if 를 거꾸로 쓰 는 것 은 if 문장의 끝 을 나타 내 는 것 입 니 다. fi 는 단독으로 한 줄 이 되 어야 합 니 다.
 
예 2: 스 크 립 트 를 작성 하여 다음 과 같은 기능 을 수행 합 니 다. 존재 하면 UID 와 SHELL 을 표시 합 니 다.
이 예 는 이전 과 매우 유사 하 며, 표시 할 내용 을 uid 로 바 꾸 었 을 뿐이다. 셸 과 함께 캡 처 방법 으로 구현 할 수 있 습 니 다.
[root@localhost tutor]# vim if_uid.sh
#!/bin/bash
#
UserName=user1
if id $UserName &> /dev/null; then
        grep "^$UserName\>" /etc/passwd | cut -d: -f3,7
fi

[root@localhost tutor]# id user1
id: user1: No such user

[root@localhost tutor]# useradd user1
[root@localhost tutor]# chmod +x if_uid.sh
[root@localhost tutor]# ./if_uid.sh
500:/bin/bash

 
예 3: 스 크 립 트 를 작성 하여 다음 과 같은 기능 을 수행 합 니 다. 장치/dev/sdb 3 가 마 운 트 되 어 있 으 면 마 운 트 지점 을 표시 합 니 다.
어떤 장치 가 마 운 트 되 었 는 지 확인 하려 면 mount 명령 을 사용 하여 모든 마 운 트 장 치 를 받 은 다음 grep 명령 을 사용 하여 구체 적 인 장 치 를 볼 수 있 습 니 다.
[root@localhost tutor]# mount
/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
/dev/sdb3 on /mydata type ext4 (rw,noatime)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/dev/sr0 on /media/20140715_2041 type iso9660 (ro,nosuid,nodev,uhelper=udisks,uid=0,gid=0,iocharset=utf8,mode=0400,dmode=0500)

[root@localhost tutor]# mount | grep "^/dev/sdb3"
/dev/sdb3 on /mydata type ext4 (rw,noatime)
#         ,      /mydata    

따라서 이 스 크 립 트 는 다음 과 같은 형식 으로 쓸 수 있 습 니 다.
[root@localhost tutor]# vim if_uid.sh
#!/bin/bash
#
Device='/dev/sdb3'
 
if mount | grep "^$Device" &> /dev/null; then
        mount | grep "$Device" | cut -d' ' -f3
fi

[root@localhost tutor]# bash -n mount_point.sh
[root@localhost tutor]# chmod +x mount_point.sh
[root@localhost tutor]# ./mount_point.sh
/mydata
 
예 4: 스 크 립 트 를 작성 하여 다음 과 같은 기능 을 수행 합 니 다./etc/rc. d/rc. sysinit 에 빈 줄 이 있 으 면 빈 줄 수 를 표시 합 니 다.
grep 를 사용 하여 빈 줄 을 찾 은 다음 grep 를 한 번 에 모든 빈 줄 을 표시 할 수 있 습 니 다. 마지막 으로 wc 명령 을 사용 하여 줄 수 를 통계 할 수 있 습 니 다. 구체 적 인 조작 은 다음 과 같 습 니 다.
[root@localhost tutor]# grep "^$" /etc/rc.d/rc.sysinit
 #           

[root@localhost tutor]# echo $?
0
#        ,      

 
[root@localhost tutor]# vim blank_line.sh
#!/bin/bash
#
File='/etc/rc.d/rc.sysinit'
 
if grep "^$" $File &> /dev/null; then
        grep "^$" $File |wc -l
fi

[root@localhost tutor]# bash -n blank_line.sh
[root@localhost tutor]# chmod +x blank_line.sh
[root@localhost tutor]# ./blank_line.sh
96

좋은 웹페이지 즐겨찾기