【问题标题】:Looping function bash循环函数bash
【发布时间】:2017-07-31 17:09:10
【问题描述】:

我目前正在学习 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

我的问题是......我是通过应用第二种方法以正确的方式还是有另一种方法?

感谢您的反馈

【问题讨论】:

  • 仅供参考,== 不是 POSIX 标准化的 test 功能的一部分;标准字符串比较运算符是=。并且总是引用你的扩展——! [ "$number" = 1 ] 不太容易出现意外;考虑如果用户输入23 = 23 -o 5会发生什么;你会得到[ ! 23 = 23 -o 5 == 1 ]
  • 当你想在 bash 中检查不等于 int 的东西时,使用if [ $number != 1 ]。它也更具可读性。
  • @Vinny, err, re: "to an int" - 这是字符串比较,而不是数字比较。 (= 也是字符串比较;如果我们确定这些值在相同的基数中并且没有前导零,那么在我们开始进行大于或小于比较之前,这并不重要)。
  • ...由于这将递归描述为“循环”是不准确的,因此我将其称为过于宽泛——这根本不是一个真正的 bash 问题;在任何语言的调用堆栈(因此允许可重入函数)中,有人可能会有同样的误解、误解和相关的错误。
  • @CharlesDuffy 我的意思是数字比较,谢谢指出。

标签: bash function loops break


【解决方案1】:

由于您使用recursion 进行“循环”,因此当每个函数完成时,您仍在执行该函数的最后几行。

要真正创建循环,您可以使用while; do 结构来正确执行它。

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

【讨论】:

    【解决方案2】:

    您使用的是递归,而不是循环。尝试以这种方式使用循环:

    #!/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
    

    【讨论】:

    • [ ! $number == 1 ] 有问题。考虑如果number 是一个空字符串或23 = 23 -o 5 会发生什么。始终引用您的扩展,并使用符合 POSIX 的语法(=,而不是 ==),这样您的代码就可以在 ash 或 dash 等 shell 上运行:! [ "$number" = 1 ]
    • 引用确实很有帮助;花括号没有区别; === 的区别仍然使此代码仅 bash(而不是能够在带有 dash 的 Debian 系统上工作)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多