BASH-函数返回错误的值

BASH-函数返回错误的值,bash,shell,Bash,Shell,我写剧本已经有一段时间了。我从一开始就不好 我正在编写一个测试oracle DB连接的脚本 testDB() { [[ $(tnsping $tnsName | grep -c WRONG)==1 ]] && return 1 return 0 } testDB status="${?}" echo "Status value= " $status 我希望我的回音中的值为0,但不知何故,我的状态在回音中显示为1 我做错了什么 编辑2: 我最初的代码是: tes

我写剧本已经有一段时间了。我从一开始就不好

我正在编写一个测试oracle DB连接的脚本

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

testDB
status="${?}"
echo "Status value= " $status
我希望我的回音中的值为0,但不知何故,我的状态在回音中显示为1

我做错了什么

编辑2:

我最初的代码是:

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

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

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

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


testDB(){
如果[[$(tnsping$tnsName | grep-c错误)=1];那么
返回1
其他的
返回0
fi
}


我希望这能有所帮助。

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

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


testDB(){
如果[[$(tnsping$tnsName | grep-c错误)=1];那么
返回1
其他的
返回0
fi
}


我希望这有帮助。

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

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

testDB
echo "Status value= " $?

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

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

testDB
echo "Status value= " $?

你对
[[$(tnsping$tnsName | grep-c错误)==1]]&&return 1
的意图不是很清楚。基本上,我希望从tnsping获得grep-c OK。如果tnsping成功,计数将为1。TNSPING不应在结果中包含任何被称为错误的单词。。所以计数应该是0。@sjsam运算的直接问题是等号周围没有空格,不是吗?你的编辑把它变成了一个不同的问题;问题中的代码编辑总是有问题的-更改后问题是否仍然可以重现?@tripleee:Hmm,,我确实没有注意到……)你对
[[$(tnsping$tnsName | grep-c错误)==1]]&&return 1
的意图不是很清楚。基本上,我希望从tnsping获得grep-c OK。如果tnsping成功,计数将为1。TNSPING不应在结果中包含任何被称为错误的单词。。所以计数应该是0。@sjsam运算的直接问题是等号周围没有空格,不是吗?你的编辑把它变成了一个不同的问题;问题中的代码编辑总是有问题的-更改后问题是否仍然可以重现?@tripleee:Hmm,,我确实没有注意到……)
-q
选项很方便++尝试[$(tnsping$tnsName | grep-q错误)]&&return 1 | | return 0。函数仍然返回1/true,即使它应该为false,
[
是完全多余的。您只需要
testDB
,或者如果tnsping“$tnsName”,则直接返回
| grep-q OK;然后咕哝;else dont;fi
@Kyle,使用设计用于返回真和假退出代码的util,像
.&&return1 | | return0
这样的逻辑总是不必要的。假设util返回真/假,(例如
echo foo | grep-q bar&&echo yes | echo no
),您需要false/true,只需在需要的地方加前缀a
(逻辑非),(例如
!echo foo|grep-q bar和&echo yes|echo no
)。
-q
选项很方便++尝试过[$(tnsping$tnsName|grep-q错误)]&&return 1| |返回0。函数即使在应该为false时仍返回1/true
[[
是完全多余的。你只需要
testDB
或者直接
,如果tnsping“$tnsName”| grep-q OK;然后咕哝;否则不要;fi
@Kyle,使用一个设计为返回真和假退出代码的util,像
…&&return1 | | return 0
这样的逻辑总是不必要的。假设util返回真/假,(例如,
echo foo | grep-q条和&echo yes | | echo no
),您需要false/true,只需在需要的地方加前缀a
(逻辑非)(例如,
!echo foo | grep-q条和&echo yes | echo no
)。