【问题标题】:BASH - Function returns wrong value [duplicate]BASH - 函数返回错误值[重复]
【发布时间】:2023-03-30 18:49:01
【问题描述】:

我已经有一段时间没有编写脚本了。我一开始就不好..

我正在编写一个测试 oracle 数据库连接的脚本。

testDB() {
    [[ $(tnsping $tnsName | grep -c WRONG)==1 ]] && return 1
    return 0
}

testDB
status="${?}"
echo "Status value= " $status

我希望我的回显中的值为 0,但不知何故我的状态在我的回显中显示为 1。

我在这里做错了什么?

EDIT2:

我原来的代码是:

testDB() {
    [[ $(tnsping $tnsName | grep -c OK) -eq 1 ]] && return 1
    return 0
}

我的 $tnsName 包含正确的值,并且 grep 计数为 1,但我的函数返回 0。

【问题讨论】:

  • 你对[[ $(tnsping $tnsName | grep -c WRONG)==1 ]] && return 1的意图不是很清楚。
  • 基本上,我希望从 tnsping 中 grep -c OK。如果 tnsping 成功,计数将为 1。 TNSPING 不应在结果中包含任何名为 WRONG 的单词。因此计数为 0。
  • @sjsam OP 面临的直接问题是等号周围缺少空格,不是吗?您的编辑将其变成了另一个问题;问题中的代码编辑总是有问题 - 更改后问题仍然可以重现吗?
  • @tripleee : 嗯,确实我没注意到.. ;)

标签: bash shell


【解决方案1】:

不需要变量,也不需要grep -c。只需使用grep -q(无输出),即可返回真/假标志:

testDB() {
    tnsping $tnsName | grep -q OK
    }

testDB
echo "Status value= " $?

【讨论】:

  • -q 选项很方便 ++
  • 试过 [[ $(tnsping $tnsName | grep -q WRONG) ]] && return 1 ||返回 0 。即使它应该为假,函数仍然返回 1/true
  • [[ 完全是多余的。你想要简单的testDB 或简写的if tnsping "$tnsName" | grep -q OK; then mumble; else dont; fi
  • @Kyle,带有一个旨在返回真假退出代码的实用程序,像... && return1 || return 0 这样的逻辑总是是不必要的。假设一个util返回true/false,(例如echo foo | grep -q bar && echo yes || echo no),而你需要false/true,只需要前缀一个!(逻辑不是 i>)在需要的地方,(例如! echo foo | grep -q bar && echo yes || echo no)。
【解决方案2】:

第二行&&。它是一种同时执行多个语句的方法,其工作方式类似于许多其他语言中的布尔“和”。这会指示 bash 会话同时执行复合测试命令和 return 1 语句。

我了解您的意图是返回 1 是否测试为真,否则返回 0。如果是这样,就这样写。

testDB() { if [[ $(tnsping $tnsName | grep -c WRONG)==1 ]]; then return 1 else return 0 fi }

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2014-10-23
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多