Linux shell脚本中的比较

Linux shell脚本中的比较,linux,shell,unix,logical-operators,Linux,Shell,Unix,Logical Operators,我真的不明白这一点。我想,我可以编写一个返回代码比较,如下所示。哪个更好?为什么会这样 RC=$? if [[ $RC == '0' ]]; then if [ $RC -eq '0' ]; then if [ $RC == '0' ]; then if [ "$RC" == "0" ]; then if [ "$RC" -eq "0" ]; then if [[ "$RC" == "0" ]]; then if (( "$RC" == "0" )); then if ( "$RC" == "

我真的不明白这一点。我想,我可以编写一个返回代码比较,如下所示。哪个更好?为什么会这样

RC=$?

if [[ $RC == '0' ]]; then
if [ $RC -eq '0' ]; then
if [ $RC == '0' ]; then
if [ "$RC" == "0" ]; then
if [ "$RC" -eq "0" ]; then
if [[ "$RC" == "0" ]]; then
if (( "$RC" == "0" )); then
if ( "$RC" == "0" ); then
if (( $RC == 0 )); then
if ( $RC == 0 ); then
还有一些


如果
RC=“A”
--String怎么办?

如果您在
Bash
中,它不会按类型分隔变量,而是。。。返回是一个数值,所以我打赌:

rc=$?

if (( ! rc )); then
  # rc == 0
  Do something
fi
原因:与预期的
类型保持一致


检查:

如果您在
Bash
中,它不会按类型分隔变量,而是。。。返回是一个数值,所以我打赌:

rc=$?

if (( ! rc )); then
  # rc == 0
  Do something
fi
原因:与预期的
类型保持一致


勾选:

以上各项均不适用。在绝大多数情况下,您希望直接从
if
中检查退出代码。任何看起来像

command
RC=$?
if [ $RC == 0 ]; then
写得更加优雅、有力和习惯

if command; then
除非您特别需要检查结果代码的精确非零值

要单独解决您关于使用哪个比较运算符的问题,唯一完全可移植的变体是
[
with
=
。此传统Bourne shell运算符的语法不可移植地支持
=
以实现相等,因此这是错误的(尽管某些shell允许将其作为语法安全网)“
-eq
运算符比较数值相等,而
=
执行字符串比较。”

在现代shell中,
[[
都是可行的,这取决于您是更关心字符串比较(这是
[[
有意义的地方)还是算术(这是
((
——如果比较涉及到数字的一些实际计算,则特别有用;但它肯定是更边缘的选择,因为它对字符串比较根本没有用处)。
[[
还支持模式匹配,因此您不局限于静态字符串比较;与
[
,它需要一个双等号来进行字符串相等比较。它解决了
[
的一些棘手问题,包括但不限于使用以破折号开头的无引号变量和参数的正确行为


带有一个括号的替代方案根本不能满足您的需要。它试图在子shell中作为命令运行
$RC

以上都没有。在绝大多数情况下,您希望直接从
if
中检查退出代码。任何类似于

command
RC=$?
if [ $RC == 0 ]; then
写得更加优雅、有力和习惯

if command; then
除非您特别需要检查结果代码的精确非零值

要单独解决您关于使用哪个比较运算符的问题,唯一完全可移植的变体是
[
with
=
。此传统Bourne shell运算符的语法不可移植地支持
=
以实现相等,因此这是错误的(尽管某些shell允许将其作为语法安全网)“
-eq
运算符比较数值相等,而
=
执行字符串比较。”

在现代shell中,
[[
都是可行的,这取决于您是更关心字符串比较(这是
[[
有意义的地方)还是算术(这是
((
——如果比较涉及到数字的一些实际计算,则特别有用;但它肯定是更边缘的选择,因为它对字符串比较根本没有用处)。
[[
还支持模式匹配,因此您不局限于静态字符串比较;与
[
,它需要一个双等号来进行字符串相等比较。它解决了
[
的一些棘手问题,包括但不限于使用以破折号开头的无引号变量和参数的正确行为


带有单括号的替代方案完全不能满足您的需要。它尝试在子shell中作为命令运行
$RC

在unix中搜索stirng和number比较,并在unix中使用c语法对两者进行比较在unix中搜索stirng和number比较,在UnixC中使用c语法对两者进行比较。您可以解释一下吗你为什么赌(())?有什么好处吗?个人品味@realspirituals,在回答更新的问题时解释。感谢迄今为止的努力。你能解释一下你为什么赌(())吗?有什么好处?回答中解释的个人品味@realspirituals更新了问题。感谢迄今为止的努力-感谢您的努力。如果它是字符串呢?命令的返回值
$?
永远不是字符串。您可以使用
if[$?-eq 0]
对于这些情况。另一种可能是跳过关键字
if
,但我只在少数情况下使用它:向上投票-感谢您的努力。如果它是字符串呢?命令的返回值
$?
从来不是字符串。如果[$?-eq 0],您可以使用
if[$?-eq 0]
用于这些情况。另一种可能是跳过关键字
(如果
),但我只在少数情况下使用: