21_Shell 언어 - 조건 판단 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
바이너리 파일cat 또는tail, 터미널 디코딩 시 처리 방법cat으로 바이너리 파일을 보려고 할 때 코드가 엉망이 되어 식은땀이 났다. 웹에서 스크롤된 정보의 처리 방법과alias의 설정을 요약합니다. reset 명령을 사용하여 터미널을 재설정합니다.이렇게 하면 고치지 못하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.