2016-09-30 4 views
2

나는 스크립트를 강타 할 새로운 해요 다음과 같은 간단한배쉬 스크립트 검사 조건

function wait_some { 
    if [ -z $1 ]; 
     echo some_string 
     then if ! [[ $1 =~ ^[0-9]+([.][0-9]+)?$ ]]; 
     then 
      echo "$1 is not a number" 
      exit 2 
     else echo "it's a number" 
     fi 
    fi 
} 

wait_some 2.2 //prints some_string and then it's a number 

를 작성하려고 그리고 예상대로이 작동합니다.

하지만 에코 "일부 문자열을 삭제하면 '그것은 아무것도 출력하지 :

function wait_some { 
    if [ -z $1 ]; 
     then if ! [[ $1 =~ ^[0-9]+([.][0-9]+)?$ ]]; 
     then 
      echo "$1 is not a number" 
      exit 2 
     else echo "it's a number" 
     fi 
    fi 
} 

wait_some 2.2 //prints nothing 

왜 왜 조건 검사가 기능을 중단 직후 echo some_string 삭제 않습니다

답변

2

if-condition가 실행되고 있기 때문이다? 복합 command1bash에서 문로서. command2 및 테스트 연산자 -z의도 잘못된 사용

두 예제 모두에 대해 set -x 옵션을 사용하여 디버깅 한 내용을 설명합니다. 성공적인 들어

, 이것은 당신이 두 조건이 [ -z 2.2 ]이 실패 실행하기 볼 수 있듯이 실행 순서가

++ wait_some 2.2 
++ '[' -z 2.2 ']' 
++ echo some_string 
some_string 

인 것입니다. 하지만 왜? 문자열의 길이가 0이 아니므로 (See how -z works) 검사에서 조건의 실패가 발생 했으므로 [ ! -z 2.2 ]이어야합니다. 그리고 그것으로 끝나지 않습니다.

사용 된 조합 된 명령 세트로 인해 command1; command2command1 실패한 if-condition, 긍정적 인 리턴 코드, 전체 if-condition 성공하고 정규식 검색을 선도하고 이후 echo'ed 문을 볼 수 있습니다와 단지 일반 echo 실행 성공적으로 지금 command2. 당신이 볼 수 있듯이

++ wait_some 2.2 
++ '[' -z 2.2 ']' 

에서, echo 문을 제거에서 if-condition에 대한 전반적인 리턴 코드가 거짓이 될 것처럼

지금 실패 경우에, set -x에서 확장 된 결과는 모양과 내부 조건은 전혀 행사되지 않았다. 또한 echo 문을 제거하는 것은 당신의 상태의 실패로 이어지는

++ wait_some 2.2 
++ '[' -z 2.2 ']' 
++ false 

로 확장 한 것이다 실제로

if [ -z $1 ]; 
    false 

같은 스크립트에서 false 연산자를 추가하는 것과 유사합니다. 스크립트가 코딩되어 있어야 이상적인 방법은

#/bin/bash 

# See the updated if-condition and code reorganization 

function wait_some { 
    if [ ! -z "$1" ];        
    then 
     if ! [[ $1 =~ ^[0-9]+([.][0-9]+)?$ ]]; 
     then 
      echo "$1 is not a number" 
      exit 2 
     else echo "it's a number" 
     fi 
    fi 
} 

wait_some 2.2 

당신의 오류에 대한 가장 좋은 것은 같은도 http://www.shellcheck.net/if-condition에 잘못된 구문을 확인하고 스크립트가 문제가 없었 주장 할 수 없습니다입니다.

+0

작동합니다. 감사합니다. – user3663882

+2

'-z' 테스트는 필요하지 않습니다. 빈 문자열을 정규 표현식과 정확하게 일치 시키려고 할 수 있습니다. 빈 문자열은 숫자가 아닙니다 :) – chepner

+0

@chepner : 주석 주셔서 감사합니다. 잘못된 구문을 제외하고 작성자의 코드를 수정하고 싶지 않았습니다. 많은 개선이 가능합니다. :) – Inian