微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以在 Bash case 语句中使用函数作为测试吗?

如何解决我可以在 Bash case 语句中使用函数作为测试吗?

我可以在像这样的 bash case 语句中使用函数而不是常规模式、字符串等吗?

#!/bin/bash

var="1"

is_one () {
[$var -eq 1]
}

case $var in

    is_one) 
    "var is one"
    ;;
    
    *) 
    "var is not one"
    break
    ;;
    
esac

解决方法

您可以在语句中使用函数,也可以使用 test/[ 等程序,即 whileuntilif。然而,case 语句只允许模式,不允许程序/函数。

随便用

if is_one; then
  echo "var is one"
else
  echo "var is not one"
done

case $var in
  1) echo "var is one" ;;
  *) echo "var is not one" ;;
esac
,

当然你可以使用函数,但函数应该打印你想要匹配的模式作为一个glob。这就是 case 的作用。

is_one () {
    echo 1
}

case $var in
   "$(is_one)") echo 'It matched!';;
   *) echo ':-(';;
esac

如果您真的想使用一个函数,也许更好的设计是编写一个(不包含语法错误并且)在失败时返回非零退出代码的函数。在这种特殊情况下,将其封装在一个函数中并没有多大意义,但您当然可以:

is_one () {
    [ "$1" -eq 1 ]
}
if is_one "$var"; then
    echo 'It matched!"
else
    echo ':-('
fi

注意 non-optional spaces inside [...]quoting, 以及使用参数而不是对全局变量进行硬编码。

此外,请注意 -eq 执行数字比较,如果 $var 不是数字,则会显示令人不安的错误消息。也许您更喜欢使用 [ "$1" = "1" ] 来执行简单的字符串比较。这在语义上也更接近于 case 的作用。

,

主要区别在于 if... elif... 根据正在执行的命令的 exit 代码区分其替代项,而 {{1} }.... 基于 string 值。您的函数在调用时仅通过其退出代码显示其结果。

如果您想使用带有 case 的函数,您需要将此退出代码转换为字符串,例如:

case

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。