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

我可以在Bash case语句中将函数用作测试吗?,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 您可以在语句中使用函数,其中也可以使用诸如te

我可以在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


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

你是一个吗{ 回声1 } 案例$var in $is_one echo‘它匹配了!’;; *回声“:-”;; 以撒 如果您真的想使用函数,也许更好的设计是编写一个不包含语法错误并在失败时返回非零退出代码的函数。在这种情况下,将其封装在函数中并没有多大意义,但您当然可以:

你是一个吗{ [$1-等式1] } 如果是一个$var;那么 “回声”匹配! 其他的 回声':-' fi 请注意和使用参数,而不是硬编码全局变量


此外,请注意,-eq执行数值比较,如果$var不是数值,它将打印一条令人不安的错误消息它执行一个简单的字符串比较。这在语义上也与case的比较更接近。

主要区别在于,if…elif…根据正在执行的命令的退出代码区分其替代项,而case…基于字符串值。调用函数时,仅通过其退出显示其结果代码

如果要将函数用于案例,则需要将此退出代码转换为字符串,例如:

is_one
var=$? # Store exit code as a string into var
case $var in
1) echo "exit code is one" ;;
101) echo "exit code is onehundredandone" ;;
*) echo "I do not care what the exit code is" ;;
esac

顺便说一句:您不需要在bash的case语句中使用break。bash使用;;来代替。此外,您还需要在[and]周围使用空格。因此,评估方法是否匹配(例如,是真的还是假的)不起作用?最后,对于真值测试,我需要一个悬空的if-else语句?当然,您可以编写一个返回真或假的函数,但case只对模式起作用,因此您必须使用不同的流控制语句,是的。我不知道您需要这样做如果我正确理解你的意思的话,我会特别提到一个悬而未决的if-else语句。根据你问题中的定义,当然除了语法错误,正如其他地方指出的那样,如果!is__-one;那么echo is not;fi,如果你只想掩盖失败的话。@vonspotz:trueish和false,你需要if,till或whi原因是他们运行一个命令并对其退出代码做出反应,而case不运行命令。echo true或echo false是什么?没有引号也可以吗?这里引号是可选的,但对于初学者来说是很好的练习。简言之,引用所有内容,直到你发现引号实际上破坏了某些内容ng.有关详细建议,请参见但也可以参见@triplee:通常是这样,但并不总是这样。想象一下,您运行一些函数,需要收集它们的退出代码,然后再做出决定。除了将$?存储在某个位置之外,别无选择。当然,在这个具体的玩具示例中,没有人真正想要用例,使用if,我们可以避免但OP可能想作为一个编程练习,看看这里是否也可以使用case,然后我们需要$?。实际上,我将其分配给var而不是直接在case语句中使用它的原因是为了避免$ral是一行中的空格。例如,echo I am Hunger和echo I am Hunger产生不同的输出。
is_one
var=$? # Store exit code as a string into var
case $var in
1) echo "exit code is one" ;;
101) echo "exit code is onehundredandone" ;;
*) echo "I do not care what the exit code is" ;;
esac