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

von*_*otz -1 bash

我该如何正确地使用自定义的方法是测试参数,例如,如果一个字符串是一个单词,或者一个版本号,在有条件的情况下ifwhileuntil声明?

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

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

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

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

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

Sté*_*las 5

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

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
}
Run Code Online (Sandbox Code Playgroud)

那一个返回case复合命令的退出状态,复合命令本身返回其中执行的最后一个命令(所以要么是 thetrue要么是false这里的命令)。

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

if isnewer /etc/passwd /etc/shadow; then
  echo passwd newer than shadow
fi
Run Code Online (Sandbox Code Playgroud)
if isvowel "$x" || isvowel "$y"; then...
Run Code Online (Sandbox Code Playgroud)

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

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

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