2016-09-30 53 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執行?作爲bash中的複合語句,即command1; command2以及在測試運算符中不正確使用-z

我會用兩個例子中的set -x選項的調試來解釋它。

對於成功,這是執行順序是

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

正如你可以看到得到執行這兩個條件[ -z 2.2 ]失敗。但爲什麼?由於該字符串的長度不爲零(See how -z works),並且該檢查正在導致條件失敗,應該是[ ! -z 2.2 ]。它並沒有結束。

由於您已經使用了一套命令組合,因此您可以使用command1; command2command1失敗if-condition,現在command2這只是一個簡單的echo運行成功地與正收益代碼使得整體if-condition成功,導致正則表達式搜索,你能看到後續echo'ed聲明。

現在失敗的情況下,從set -x展開的結果看起來像

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

正如你所看到的,在去除echo聲明,對於if-condition總體返回碼已成爲虛假和內部條件根本沒有行使。還準備卸下echo語句類似於在腳本實際上增加了false運營商像

if [ -z $1 ]; 
    false 

這將擴大到

++ wait_some 2.2 
++ '[' -z 2.2 ']' 
++ 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