2017-07-31 92 views
1

我目前正在學習bash,如果值不是預期的,我正在使用循環函數來調用函數。循環函數bash

我創建了一個小功能

#!/bin/bash 

find_number(){ 
    echo "Enter number" 
    read number 

    if [ ! $number == 1 ]; then 
    echo is not 1, enter number again 
    find_number 
    fi 

echo "Got it" 
} 

find_number 

如果輸入了一個錯誤的值就重啓功能,並創建一個循環,但唯一的問題是,該功能循環本身,當它繼續終於返回的回聲作爲很多時候你錯了。

例:

Enter number 
    5 
    is not 1, enter number again 
    Enter number 
    5 
    is not 1, enter number again 
    Enter number 
    1 
    Got it 
    Got it 
    Got it 

正如你看到這裏,我已經得到了結果的3倍。 要解決此問題,我以另一種方式寫了我的代碼。

#!/bin/bash 

find_number(){ 

    echo "Enter number" 

    while read number; do 
    if [ ! $number == 1 ]; then 
     echo is not 1, enter number again 
    else 
     break 
    fi 
    done 

echo "Got it" 
} 

find_number 

我的問題是......我是通過應用第二種方法來做正確的方法,還是有另一種方法呢?

感謝您的反饋

+0

僅供參考,'=='不是POSIX標準化'測試'功能的一部分;標準的字符串比較運算符是'='。並且總是引用你的擴展 - '! [「$ number」= 1]'更不容易出現意外;考慮如果用戶輸入'23 = 23 -o 5'會發生什麼;你會得到'[! 23 = 23 -o 5 == 1]'。 –

+0

當你想檢查一些東西不等於bash中的int時,使用'if [$ number!= 1]'。它更具可讀性。 – Vinny

+0

@Vinny,錯誤,重新:「到一個int」 - 這是字符串比較,而不是數字比較。 ('='也是字符串比較;如果我們確定這些值是在同一個基礎中,並且沒有前導零,那麼直到我們開始做比較或比對比更少的時候,這並不重要)。 –

回答

0

您正在使用遞歸,而不是循環。嘗試使用這種方式循環:

#!/bin/bash 

find_number(){ 
    echo "Enter number" 
    read number 

    while [ ! "${number}" == "1" ]; do 
    echo "is not 1, enter number again" 
    read number 
    done 

    echo "Got it" 
} 

find_number 
+2

'[! $數字== 1]'是越野車。考慮一下如果'number'是一個空字符串,或者'23 = 23 -o 5'會發生什麼。總是引用你的擴展,並使用符合POSIX的語法('=',而不是'=='),這樣你的代碼就可以在諸如ash或dash之類的shell上工作:'![「$ number」= 1]' –

+0

謝謝。我修復了我的答案 –

+0

引用確實有幫助;花括號不會有所作爲; '=='和'='的區別仍然使得這段代碼僅僅是bash(而不是能夠使用破折號在Debian系統上工作)。 –

1

由於您使用recursion以「環」,當每個函數結束,你還在執行該功能的最後幾行,因爲他們完成了。

要真正創建一個循環,您可以使用while; do結構正確執行它。

如果您沒有穩定的基礎(結束)條件,則爲遞歸調用函數本身可能會產生更大的開銷。