如何解决我可以在 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
/[
等程序,即 while
、until
和 if
。然而,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 举报,一经查实,本站将立刻删除。