Bash:如何在条件构造中使用自定义函数(返回 true 或 false)?

Bash:如何在条件构造中使用自定义函数(返回 true 或 false)?

if如何在、while或语句的条件上下文中正确使用测试参数的自定义方法,例如,字符串是否是单词或版本号until

特别是(双)大括号似乎在测试一侧的方法有问题,例如-gt.

我可以只调用一个方法吗?如果是,这样做的背景要求是什么?那么(双)括号内/外以及不同的语句中ifwhile以及until- 它们如何对没有命令替换的调用函数做出反应?

如果我不使用命令替换来调用不同的测试方法,我仍然可以通过布尔运算符连接它们吗?

对于它们的连接,是否存在必须使用括号或双括号的用例?

什么时候需要命令扩展?我有时需要算术扩展来调用函数吗?

答案1

您希望您的函数像所有其他命令(包括该[命令)一样通过退出状态返回成功/失败 true/false,方法是使用return带有 0 作为 true/success 参数的内置函数以及 false/failure 的其他任何参数,或者仅返回该函数运行的最后一个命令的退出:

isnewer() {
  [ "$1" -nt "$2" ]
  # here returns with the status of the [ command
}

isvowel() {
  case $1 in
    ([aeiouAEIOU]) true;; # or return 0
    (*) false;;           # or return 1
  esac
}

该命令返回复合命令的退出状态case,该命令本身返回其中执行的最后一个命令(因此此处的命令truefalse命令的退出状态)。

然后在您的if/while语句中,您调用这些函数,而不是[命令:

if isnewer /etc/passwd /etc/shadow; then
  echo passwd newer than shadow
fi
if isvowel "$x" || isvowel "$y"; then...

至于您(我不清楚)对双大括号或双括号的引用, while[只是一个普通命令(该test命令的另一个名称),Korn shell 和一些衍生产品包括bash

  • 一个(( arithmetic expression ))构造,它计算算术表达式(遵循类似于 C 语言的语法,并且在 shell 之间有所不同),如果结果数字不是 0,则返回 true/成功(像往常一样通过 0 退出状态)。该算术表达式语法确实有一些类似于 C 语言的比较和布尔运算符 ( <, >=, ||, &&...)。
  • 一个构造,它计算条件表达式(使用它自己的语法,也因 shell 的不同而不同,并且让人想起解析其参数的[[ conditional expression ]]方式。该构造,如/命令,可用于执行许多类似上面的测试或比较字符串甚至数字。[[test-nt

然而 bash 中没有双括号运算符。

相关内容