Bash 分配 bool 函数的变量结果,然后检查

Bash 分配 bool 函数的变量结果,然后检查

我正在尝试创建一个返回 0 或 1(即 true 或 false)并接受参数的函数,然后在另一个函数中创建一个变量来存储该函数的结果。最后检查该变量是 0 还是 1(true 或 false)

这是我正在尝试的示例

#!/bin/bash

_has_string() {
  if [ $1 == "string" ];
    return 0
  else
    return 1
  fi
}

_my_func() {
  var=$(_has_string "string")
  if [ $var == "0" ]; then
    echo "var contains string"
  else
    echo "var does not contain string"
  fi
}

_my_func

我已经尝试了一些变体,但似乎无法找到让它发挥作用的方法。我的所有变体基本上只是返回什么$var都没有。不是 0。不是空。从字面上看,它只是空白。

答案1

您将输出与退出代码混淆了。

_my_func() {
  if _has_string 'string'; then

您还应该引用您的变量;并且_has_string可以简化为:

_has_string() {
    [ "$1" = 'string' ]
}

答案2

$(...)返回输出命令的内容:发送到标准输出的内容。你想要的退出代码。 bash 脚本中的进程(或者在您的情况下是函数)退出后,特殊变量$?将设置为退出代码。

所以而不是

var=$(_has_string 'string')
...

考虑

_has_string 'string'
var=$?
...

答案3

正如其他人已经指出的那样,您只需要在if语句中使用该函数即可。这里有一些你可能不知道的事情:

函数可以被视为一种形式复合命令。根据 bash 手册,[[它是可用于构建复合命令的运算符之一。因此,您的函数_has_string()可以这样实现:

$ _has_string()[[ "$1" = "string" ]]
$ if _has_string "string"; then echo "YES"; fi
YES

当然,由于运营商的原因,这绝不是可移植的[[。但我们可以利用( )or {}。例如,这是如何工作的/bin/dash

$ _has_string()( [ "$1" = "string" ]; )
$ if _has_string "string"; then echo "YES"; fi
YES
$ if _has_string "nope" ; then echo "YES"; fi                             
$ 

相关内容