2017-07-31 125 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结构正确执行它。

如果您没有稳定的基础(结束)条件,则为递归调用函数本身可能会产生更大的开销。