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