Shell 脚本 = 命令“测试” = 简单问题

Shell 脚本 = 命令“测试” = 简单问题

启动脚本的摘录如下:

已启用=1

测试“$ENABLED”!=“0”||退出0

问题是,无论 Enabled 设置为 0 还是 1,脚本总是在该行退出。我查了一下“man test”,据我所知,test 总是会评估表达式,然后退出(!!)并返回代码?这是正确的吗?所以无论变量的值是什么,这个脚本都会在该行退出?(所以它有缺陷)。

谢谢!!jens

答案1

#!/bin/bash
ENABLED=1
test "$ENABLED" != "0" || exit 0
echo "wasn't zero"

当我运行这个时,我得到

[madhatter@risby tmp]$ ./foo
wasn't zero

所以在我看来任何一个

  • 你使用的解释器很奇怪(你在哪个 shell 下运行这个程序),或者
  • 你选错了“测试”(你可以做一个“哪个测试”并告诉我们结果,或者明确使用“/usr/bin/test”吗?),或者
  • (抱歉)你错了,它没有进入下一行(正如 Janne 上面所说,我们能否看到更多的 shell 脚本,或者你可以像我的 echo 语句一样放一行金丝雀立即地测试后?

答案2

该测试语句基本上是说“如果 $ENABLED 设置为 0 以外的其他值,则退出并返回代码 0(在 Linux/Unix 这个美妙的世界中,这通常意味着 OK)”。

这是否让你明白了一切?如果没有看到完整的启动脚本,很难告诉你更多信息 :-)

答案3

这里有一些一般的假设,试图具体回答这个问题,那就是:

因此,无论变量的值是什么,此脚本都会在此行退出?(因此它有缺陷)。

是的,或多或少,但不一定会退出整个脚本。而且,不,它没有错误;如果我的假设正确

正如其他人提到的,在没有看到更多脚本的情况下很难给出明确的答案,但我想您不愿意分享您添加了什么包是有原因的,我不会试图对此做出判断。相反,我只是假设您原谅,假设脚本中的这个小片段靠近开头,在声明了一些参数(例如 PATH、NAME 等)之后不久,脚本中还有更多内容,可能大部分内容都在此之后。(因此,对于脚本为什么有这个内容的回答似乎很荒谬。)

需要澄清的是,脚本的这一部分很可能只是为了确保在脚本启动时,它调用/使用的函数/进程的实例尚未启动或正在使用。换句话说,如果脚本调用,program那么基本上,它会检查是否program已经在运行,如果是,则悄悄退出,然后脚本可以继续启动,而不会遇到涉及program另一个正在运行的进程或实例的错误。特别是如果已经启动的进程的参数设置与脚本调用的参数不同,那么你就会责怪脚本。

再次强调,我们做出了假设并且解释很宽泛,但希望这有助于澄清任何对这个十年老问题有所了解的人。

噗,11 年来 170 次观看……啊,只需要一票就值得了!

相关内容