고급 Bash 스 크 립 트 프로 그래 밍 가이드 (6): 조건 테스트 구조
10827 단어 shell
견지했어
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
계속
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ZSH에서 물고기까지ZSH는 수년 동안 내 기본 셸이었습니다. 이제 몇 달 동안 사용하면서 ZSH 구성에 대해 몇 가지 사항을 발견했습니다. 우리는 을 제공하는 시스템과 더 빨리 상호 작용하는 경향이 있습니다. 내.zshrc 구성에는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.