고급 Bash 스 크 립 트 프로 그래 밍 가이드 (6): 조건 테스트 구조

10827 단어 shell
고급 Bash 스 크 립 트 프로 그래 밍 가이드 (6): 조건 테스트 구조
견지했어
if/then 구 조 는 명령 목록 의 종료 상태 코드 가 0 인지 판단 하 는 데 사 용 됩 니 다.. 이 명령 은 test 명령 과 등가 이 며, 효율 적 인 고려 에서 내 장 된 명령 입 니 다. 이 명령 은 매개 변 수 를 비교 표현 식 이나 파일 테스트 로 하고, 비교 결과 에 따라 종료 상태 코드 를 되 돌려 줍 니 다.
조건 판단 구 조 는 다음 과 같다.
if [ condition-true]
then
	command1
	command2
	.......
else
	command3
	command4
	.......
if

만약 if 와 then 이 조건 판단 의 같은 줄 에 있다 면, 반드시 분 호 를 사용 하여 if 표현 식 을 끝내 야 합 니 다. if 와 then 은 모두 키워드 입 니 다. 키워드 (또는 명령) 가 표현 식 의 시작 이 고, 같은 줄 에 새로운 표현 식 을 쓰 려 면, 분 호 를 사용 하여 이전 표현 식 을 끝내 야 합 니 다.
if [ -x "$filename"]; then
그러나 else if 의 등장 에 주의해 야 합 니 다. 구 조 는 다음 과 같 습 니 다.
if [condition1]
then
	command1
	......
elif[condition2]
then
	command2
	.......
else
	command3
	.....
fi

그러나 우리 가 잘 아 는 c 언어 에서 의 판단 과 는 많이 다르다. 우 리 는 테스트 조건 의 진 위 를 보 는 간단 한 테스트 프로그램 을 살 펴 보 자.
#!/bin/bash

#     :
#                        ,     if-test  . 
echo "Testing \"0\""
if [ 0 ]      # zero
then
	echo "0 is true."
else
	echo "0 is false."
fi            # 0   .

echo
echo "Testing \"1\""
if [ 1 ]      # one
then
	echo "1 is true."
else
	echo "1 is false."
fi            # 1   .

echo
echo "Testing \"-1\""
if [ -1 ]     #  1
then
	echo "-1 is true."
else
	echo "-1 is false."
fi            # -1   .

echo
echo "Testing \"NULL\""
if [ ]        # NULL (   )
then
	echo "NULL is true."
else
	echo "NULL is false."
fi            # NULL   .

echo
echo "Testing \"xyz\""
if [ xyz ]    #    
then
	echo "Random string is true."
else
	echo "Random string is false."
fi            #          .

echo
echo "Testing \"\$xyz\""
if [ $xyz ]   #   $xyz   null,               .
then
	echo "Uninitialized variable is true."
else
	echo "Uninitialized variable is false."
fi            #          .

echo
echo "Testing \"-n \$xyz\""
if [ -n "$xyz" ]            #          .
then
	echo "Uninitialized variable is true."
else
	echo "Uninitialized variable is false."
fi            #          .

echo
xyz=          #     ,    null .
echo "Testing \"-n \$xyz\""
if [ -n "$xyz" ]
then
	echo "Null variable is true."
else
	echo "Null variable is false."
fi            # null    . 

echo
xyz=1         #     ,    null .
echo "Testing \"-n \$xyz initilized\""
if [ -n "$xyz" ]
then
	echo "Initilize variable is true."
else
	echo "Null variable is false."
fi  

echo
echo "Testing \"false\""
if [ "false" ]              #     "false"           . 
then
	echo "\"false\" is true." #+            .
else
	echo "\"false\" is false."
fi            # "false"   .

echo
echo "Testing \"\$false\""  #     ,        .
if [ "$false" ]
then
	echo "\"\$false\" is true."
else
	echo "\"\$false\" is false."
fi            # "$false"   .  ,           .
exit 0

결 과 를 보면 먼저:
root@ubuntu:~/resource/study/shell# ./ifelse-test 
Testing "0"
0 is true.

Testing "1"
1 is true.

Testing "-1"
-1 is true.

Testing "NULL"
NULL is false.

Testing "xyz"
Random string is true.

Testing "$xyz"
Uninitialized variable is false.

Testing "-n $xyz"
Uninitialized variable is false.

Testing "-n $xyz"
Null variable is false.

Testing "-n $xyz initilized"
Initilize variable is true.

Testing "false"
"false" is true.

Testing "$false"
"$false" is false.

사실 이 결 과 는 의외로 느껴 집 니 다. 위의 0, 1, - 1 은 모두 진실 이 고 임 의 문 자 는 진실 입 니 다. 변 수 를 가짜 로 초기 화하 지 않 았 습 니 다. 변 수 를 진짜 로 초기 화 했 습 니 다. null 은 가짜 test,/usr/bin/test, [] 와/usr/bin/[이렇게 많은 데 저 는 어 지 럽 습 니 다. 사실은 그들 은 모두 등가 입 니 다.
인 스 턴 스 를 보고 검증 합 니 다.
#!/bin/bash

one=
if test -z "$one"
then
	echo "No command-line arguments."
else
	echo "First command-line argument is $one."
fi
one=1
if test -z "$one"
then
	echo "No command-line arguments."
else
	echo "First command-line argument is $one."
fi

two=
echo
if /usr/bin/test -z "$two"      #     "test"      . 
then
	echo "No command-line arguments."
else
	echo "First command-line argument is $two."
fi
two=2
if /usr/bin/test -z "$two"      #     "test"      . 
then
	echo "No command-line arguments."
else
	echo "First command-line argument is $two."
fi

echo
three=
if [ -z "$three" ]
then
	echo "No command-line arguments."
else
	echo "First command-line argument is $three."
fi
three=3
if [ -z "$three" ]
then
	echo "No command-line arguments."
else
	echo "First command-line argument is $three."
fi
 
echo
four=
if /usr/bin/[ -z "$four" ]
then
	echo "No command-line arguments."
else
	echo "First command-line argument is $four."
fi
four=4
if /usr/bin/[ -z "$four" ]
then
	echo "No command-line arguments."
else
	echo "First command-line argument is $four."
fi

echo
exit 0

집행 결과 보기;
root@ubuntu:~/resource/study/shell# ./iftest 
No command-line arguments.
First command-line argument is 1.

No command-line arguments.
First command-line argument is 2.

No command-line arguments.
First command-line argument is 3.

No command-line arguments.
First command-line argument is 4.

위의 검증 은 그들 이 완전히 등가 라 는 것 을 설명 하 는데, 의심의 여지 가 없다.
[[]] 구조 와 [] 구조 가 더욱 통용 되 고 [[]] 사이 의 모든 문 자 는 파일 이름 확장 이나 단어 분할 이 발생 하지 않 지만 매개 변수 확장 과 명령 교체 가 발생 합 니 다.
#!/bin/bash
echo "For [[ ]] test:"
file=/etc/passwd
if [[ -e $file ]]
then
	echo "$file exits"
else
	echo "$file not exits"
fi
exit 0

결과:
root@ubuntu:~/resource/study/shell# ./double 
For [[ ]] test:
/etc/passwd exits

여기 - e 는 지정 한 파일 이 존재 하 는 지 테스트 하 는 데 사 용 됩 니 다. 여기 서 [] 를 사용 하 는 것 도 마찬가지 입 니 다.
[[...] 조건 을 사용 하여 구 조 를 판단 합 니 다. [...] 가 아니 라 스 크 립 트 의 많은 논리 적 오 류 를 방지 할 수 있 습 니 다. 예 를 들 어, &&, ||, <, 화 > 조작 부 호 는 [[] 조건 판단 구조 에 정상적으로 존재 할 수 있 으 나 [] 구조 에 나타 나 면 잘못 보고 할 수 있다. 
if 뒤에 도 꼭 test 명령 이나 조건 판단 에 사용 되 는 중 괄호 구조 ([] 또는 []) 는 아 닙 니 다. 예 를 들 어 보 겠 습 니 다.
#!/bin/bash
dir=/dev/pass
if cd "$dir"
then
	echo "Now you are in $dir"
else
	echo "You can't change to $dir"
fi

dir=/dev/char
if cd "$dir"
then
	echo "Now you are in $dir"
else
	echo "You can't change to $dir"
fi

dir=/dev/pass
if cd "$dir" 2> /dev/null
then
	echo "Now you are in $dir"
else
	echo "You can't change to $dir"
fi
exit 0

결과:
root@ubuntu:~/resource/study/shell# ./test1 
./test1: line 3: cd: /dev/pass: No such file or directory
You can't change to /dev/pass
Now you are in /dev/char
You can't change to /dev/pass

첫 번 째 는 지정 한 디 렉 터 리 가 없 기 때문에 첫 번 째 줄 의 오류 알림 을 자동 으로 알려 줍 니 다. 또한 if 가 되 돌아 오 는 상 태 를 검사 할 때 false 가 지정 한 디 렉 터 리 가 존재 합 니 다. 세 번 째 줄 에 대해 왜 출력 정보 가 없 는 지 의문 이 없습니다. 왜냐하면 2 > /dev/null 은 오류 정 보 를 숨 깁 니 다.
"if COMMAND"구 조 는 COMMAND 의 종료 상태 코드 를 되 돌려 줍 니 다.
이와 비슷 하 다. 괄호 안에 있 는 조건 판단 도 꼭 if 가 필요 한 것 은 아니다. 목록 구 조 를 사용 할 수도 있다. 목록 구조 가 도대체 무엇 인지 실례 를 통 해 이해 해 보 자.
#!/bin/bash
var1=10
var2=20
[ "$var1" -ne "$var2" ] && echo "$var1 is not equal to $var2"
dir=/dev/pass
[ -d "$dir" ] || echo "$dir directory does not exist"
exit 0
결과:
root@ubuntu:~/resource/study/shell# ./test2 
10 is not equal to 20
/dev/pass directory does not exist

이 인 스 턴 스 에 나타 난 & & | 은 위 에서 말 한 목록 구조 입 니 다.0 값 이 아 닌 표현 식 이 되 돌아 오 는 종료 상태 코드 는 0 또는 "true"입 니 다. 이러한 상황 은 이전에 토론 한 test 명령 과 [] 구조의 행동 과 정반 대 입 니 다. 듣 기 에 약간 어색 한 것 같 습 니 다. 인 스 턴 스 를 보 세 요.
#!/bin/bash
#     .
# (( ... ))                   . 
#        [ ... ]      !

(( 0 ))
echo "Exit status of \"(( 0 ))\" is $?."         # 1

(( 1 ))
echo "Exit status of \"(( 1 ))\" is $?."         # 0

(( 5 > 4 ))                                      #  
echo "Exit status of \"(( 5 > 4 ))\" is $?."     # 0

(( 5 > 9 ))                                      #  
echo "Exit status of \"(( 5 > 9 ))\" is $?."     # 1

(( 5 - 5 ))                                      # 0
echo "Exit status of \"(( 5 - 5 ))\" is $?."     # 1

(( 5 / 4 ))                                      #      .
echo "Exit status of \"(( 5 / 4 ))\" is $?."     # 0

(( 1 / 2 ))                                      #         < 1.
echo "Exit status of \"(( 1 / 2 ))\" is $?."     #          0.

(( 1 / 0 )) 2>/dev/null                          #    0,     . 
echo "Exit status of \"(( 1 / 0 ))\" is $?."     # 1
exit 0
결과:
root@ubuntu:~/resource/study/shell# ./test3 
Exit status of "(( 0 ))" is 1.
Exit status of "(( 1 ))" is 0.
Exit status of "(( 5 > 4 ))" is 0.
Exit status of "(( 5 > 9 ))" is 1.
Exit status of "(( 5 - 5 ))" is 1.
Exit status of "(( 5 / 4 ))" is 0.
Exit status of "(( 1 / 2 ))" is 1.
Exit status of "(( 1 / 0 ))" is 1.
위의 인 스 턴 스 에서 $? 위의 마지막 날 명령 의 반환 상 태 를 얻 었 습 니 다. 우 리 는 우리 가 전에 본 결과 와 일치 하 는 것 을 보 았 습 니 다.
표현 식 의 결과 가 0 이면 되 돌아 오 는 종료 상태 코드 는 1 또는 "가짜"입 니 다. 0 값 이 아 닌 표현 식 이 되 돌아 오 는 종료 상태 코드 는 0 또는 "true"입 니 다. 이러한 상황 은 이전에 논 의 했 던 test 명령 과 [] 구조의 행동 과 정반 대 입 니 다. 따라서 첫 번 째 상태 로 돌아 갈 때 1, 어떻게 if 조건 이 false 입 니까?
먼저 여기까지, O (∩ ∩) O ~
내 칼럼 주소:http://blog.csdn.net/column/details/shell-daily-study.html
계속

좋은 웹페이지 즐겨찾기