24_Shell 언어 -- if 조건 판단 의 문자 테스트

7827 단어 linuxshellelseif
앞에서 소개 한 바 와 같이 bash 의 조건 테스트 는 주로 다음 과 같은 세 가지 가 있다.
정수 테스트: 두 정수 가 누가 크 고 누가 작 으 며 똑 같은 지 비교 합 니 다.
문자 테스트: 두 문자열 이 같은 지 비교 하기;
파일 테스트: 어떤 파일 이 읽 기 권한, 쓰기 권한, 실행 권한 이 있 는 지 테스트 합 니 다.
정수 테스트 는 앞에서 소개 한 적 이 있 는데, 여 기 는 문자 테스트 에 중심 을 두 고 있다.문자 테스트 에서 사용 하 는 비교 기 호 는 자주 사용 하 는 수학 기호 이다.
>: (ASCII 메타 에서 의 우선 순위, 왼쪽 에서 오른쪽으로 한 글자 씩 비교)
<: 이하
= =: (주의, = 할당 표시)
= ~: 왼쪽 문자열 이 오른쪽 패턴 과 일치 하 는 지 판단 합 니 다. 보통 이중 괄호 에 사 용 됩 니 다.
[[ $opt1=~$opt2 ]]
보통 줄 의 첫 줄 끝 에 닻 을 내리 고 따 옴 표를 붙 이지 않 는 다.
 
상기 비 교 는 모두 두 변수의 비교 이지 만 bash 에서 도 단일 항목 테스트 를 할 수 있 습 니 다. 즉, 하나의 변수 만 테스트 할 수 있 습 니 다.
- z $STRING: 비어 있 으 면 진짜 이 고, 비어 있 지 않 으 면 가짜 입 니 다.
- n $STRING: 비어 있 으 면 가짜, 비어 있 지 않 으 면 진짜
 
다음은 문자 테스트 의 용법 을 예 로 들 어 설명 한다.
예 1: 사용자 의 셸 이 bash 인지 아 닌 지 를 판단 하 는 스 크 립 트 를 작성 합 니 다.
사용자 의 셸 을 저장 할 변 수 를 정의 한 다음 판단 할 수 있 습 니 다. ["$Shell"= "/bin/bash"] 명령 행 에서 초기 실험 을 할 수 있 습 니 다.
[root@localhosttutor]# Shell="/bin/tcsh"
\# 변수 Shell 을 정의 합 니 다. "/bin/tcsh"로 할당 합 니 다.
[root@localhosttutor]# [ $Shell == "/bin/bash"]
\# Shell 이 "/bin/bash"인지 판단 합 니 다.
[root@localhosttutor]# echo $?
1
\# 테스트 결과 보기
[root@localhosttutor]# Shell="/bin/bash"
[root@localhosttutor]# [ $Shell == "/bin/bash"]
\# 주의, $Shell 에 도 따옴표 가 붙 는 것 이 좋 습 니 다. 문자열 에 빈 칸 이 있 으 면 여러 변수 로 여 겨 질 수 있 기 때 문 입 니 다.
[root@localhosttutor]# echo $?
0

구체 적 인 스 크 립 트 는 다음 과 같 습 니 다.
[root@localhosttutor]# vim if_shell.sh
#!/bin/bash
#
 
Shell=`grep "^$1:"/etc/passwd | cut -d: -f7`
 
if [ "$Shell" =="/bin/bash" ]; then
        echo "Bash User."
        Ret=0
else
        echo "Not Bash User."
        Ret=9
fi
 
exit $Ret

[root@localhosttutor]# bash -n if_shell.sh
[root@localhosttutor]# bash if_shell.sh root
Bash User.

[root@localhosttutor]# bash -x if_shell.sh daemon
++ cut -d: -f7
++ grep '^daemon:' /etc/passwd
+ Shell=/sbin/nologin
+ '[' /sbin/nologin == /bin/bash']'
+ echo 'Not Bash User.'
Not Bash User.
+ Ret=9
+ exit 9

[root@localhosttutor]# bash if_shell.sh roott
Not Bash User.

 
여기 roott 사용 자 는 존재 하지 않 습 니 다. 스 크 립 트 에서 사용자 의 존재 여 부 를 먼저 판단 하면 스 크 립 트 가 더욱 완벽 해 집 니 다.- z 로 문자 판단 가능:
 
[root@localhosttutor]# echo $Shell
/bin/bash

[root@localhosttutor]# [ -z $Shell ]
\# - z 는 변수 Shell 에 값 이 있 는 지, 있 는 지 없 는 지 를 판단 합 니 다.
[root@localhosttutor]# echo $?
1

[root@localhosttutor]# unset Shell
\# 취소 변수 셸
[root@localhosttutor]# [ -z $Shell ]
[root@localhosttutor]# echo $?
0

따라서 이 스 크 립 트 는 다음 과 같이 개선 할 수 있 습 니 다.
[root@localhosttutor]# vim if_shell.sh
#!/bin/bash
#
 
Shell=`grep "^$1:"/etc/passwd | cut -d: -f7`
 
if [ -z $Shell ]; then
#     Shell     ,   ,    ,     ;     ,   ,       
        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

 
[root@localhosttutor]# bash -x if_shell.sh roott
++ cut -d: -f7
++ grep '^roott:' /etc/passwd
+ Shell=
+ '[' -z ']'
+ echo 'No such user or User'\''sshell is null.'
No such user or User's shell isnull.
+ exit 10

 
위의 예 를 사용 하 시 겠 습 니까? 그러나 사용자 의 셸 이 sh 로 끝 나 는 지 여 부 를 판단 하기 만 하면 패턴 이 일치 하 는 방식 으로 문자열 을 일치 시 킵 니 다.
 
[root@localhosttutor]# Shell=/bin/bash
[root@localhosttutor]# [[ “$Shell” =~ sh$ ]]
\# 줄 끝 에 닻 을 올 리 는 방식 으로 패턴 매 칭 을 하고 변수 Shell 이 sh 로 끝 나 는 지 판단 합 니 다.
[root@localhosttutor]# echo $?
0

 
상기 예제 개선 은 한 사용자 의 셸 이 sh 로 끝 나 는 지 여 부 를 판단 하 는 것 입 니 다. 로그 인 가능 한 사용자 로 표시 되 는 지, 로그 인 하지 않 은 사용자 로 표시 되 는 지 여 부 를 판단 하 는 것 입 니 다.
 
[root@localhosttutor]# vim if_shell_sh.sh
#!/bin/bash
#
 
Shell=`grep "^$1:"/etc/passwd | cut -d: -f7`
 
if [ -z $Shell ]; then
        echo "No Shell."
        exit 3
fi
 
if [[ "$Shell" =~ sh$]]; then
        echo "Login User"
        Ret=0
else
        echo "None Login User."
        Re4=4
fi
 
exit $Ret

 
[root@localhosttutor]# bash -n if_shell_sh.sh
[root@localhosttutor]# bash if_shell_sh.sh root
Login User

[root@localhosttutor]# bash if_shell_sh.sh roott
No Shell.

[root@localhosttutor]# bash -x if_shell_sh.sh daemon
++ cut -d: -f7
++ grep '^daemon:' /etc/passwd
+ Shell=/sbin/nologin
+ '[' -z /sbin/nologin ']'
+ [[ /sbin/nologin =~ sh$ ]]
+ echo 'None Login User.'
None Login User.
+ Re4=4
+ exit

[root@localhosttutor]# useradd -s/bin/tcsh hello
\# 사용 자 를 만 들 고 셸 을 tcsh 로 지정 합 니 다.
[root@localhosttutor]# bash -x if_shell_sh.sh hello
++ cut -d: -f7
++ grep '^hello:' /etc/passwd
+ Shell=/bin/tcsh
+ '[' -z /bin/tcsh ']'
+ [[ /bin/tcsh =~ sh$ ]]
+ echo 'Login User'
Login User
+ Ret=0
+ exit 0

 
예 2. 스 크 립 트 작성: 현재 호스트 의 CPU 생산 업 체 를 판단 합 니 다. 그 정 보 는/proc/cpu info 파일 에서 vendorid 줄 중.생산 업 체 가 GenuineIntel 이면 Intel 회사 로 표 시 됩 니 다.그렇지 않 으 면 AMD 회사 로 표 시 됩 니 다.
grep 명령 으로 호스트 의 생산 업 체 를 꺼 낼 수 있 습 니 다:
[root@localhosttutor]# cat/proc/cpuinfo | grep "vendor_id"| uniq
vendor_id       : GenuineIntel

[root@localhosttutor]# cat/proc/cpuinfo | grep "vendor_id"| uniq | cut -d: -f2
 GenuineIntel
#  ,            

 
이 스 크 립 트 는 다음 과 같이 쓸 수 있 습 니 다:
[root@localhosttutor]# vim if_cup.sh
#!/bin/bash
#
Vendor=`grep"vendor_id" /proc/cpuinfo | uniq | cut -d: -f2`
 
if [[ "$Vendor" =~[[:space:]]*GenuineIntel$ ]]; then
        echo "Intel"
else
        echo "AMD"
fi

[root@localhosttutor]# bash -n if_cup.sh
[root@localhosttutor]# bash -x if_cup.sh
++ cut -d: -f2
++ uniq
++ grep vendor_id /proc/cpuinfo
+ Vendor=' GenuineIntel'
+ [[  GenuineIntel =~ [[:space:]]*GenuineIntel$ ]]
+ echo Intel
Intel

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

[root@localhosttutor]# bash -n memory.sh
[root@localhosttutor]# bash -x memory.sh memory
+ [[ memory =~ ^[Mm]emory$ ]]
+ free -m
             total       used       free    shared    buffers     cached
Mem:           996        509        487         0         54        160
-/+ buffers/cache:        293        702
Swap:         2015          0       2015

[root@localhosttutor]# bash -x memory.sh Memory
+ [[ Memory =~ ^[Mm]emory$ ]]
+ free -m
             total       used       free    shared    buffers     cached
Mem:           996        509        487        0         54        160
-/+ buffers/cache:        293        702
Swap:         2015         0       2015

[root@localhosttutor]# bash -x memory.sh abc
+ [[ abc =~ ^[Mm]emory$ ]]
+ cat /proc/uptime
47430.02 46732.82

좋은 웹페이지 즐겨찾기