如何在 shell 脚本中使用和/或有条件

cub*_*e00 3 scripting ksh shell-script

if在脚本中有一个声明。

它看起来像这样:

if [ "$a" != "0" -a "$b" != "100" ]; then
 #some commands here
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,如果两个条件都为真,上面的行就会起作用。

现在,我怎么能测试无论是执行之前的一个或两个条件为真some commands

Sté*_*las 11

标准(POSIX sh 和实用程序)规范的清晰方式是:

  • 字符串比较:

    if [ "$a" != 0 ] || [ "$b" != 100 ]; then...
    
    Run Code Online (Sandbox Code Playgroud)
  • 十进制整数比较(0100 是 100,但是否忽略前导空格取决于实现)。

    if [ "$a" -ne 0 ] || [ "$b" -ne 100 ]; then...
    
    Run Code Online (Sandbox Code Playgroud)
  • 整数比较(0x64、0144 是 100(必须为八进制的某些 shell 启用 POSIX 模式)。取决于 shell 100.0、1e2、50+50,(RANDOM0.003% 的时间)......也会如此):

    if [ "$((a != 0 || b != 100))" -ne 0 ]; then...
    
    Run Code Online (Sandbox Code Playgroud)

    但是,如果变量的内容导致算术扩展失败并出现语法错误,这将导致 shell 中止,因此您可能需要在子 shell 中运行它来解决这个问题。

    if ([ "$((a != 0 || b != 100))" -ne 0 ]); then
    
    Run Code Online (Sandbox Code Playgroud)

    如果变量的内容不在您的控制之下,您可能无论如何都不应该使用该表单,因为这将是许多 shell ( , , ) 中任意命令执行漏洞(例如,值为like )。bashkshzsh$ax[$(reboot)]

您将选择哪一个取决于变量的内容可能是什么以及您希望它们成为什么。如果您知道它们包含规范形式的十进制整数,则所有 3 种数字都是等价的。

在任何情况下,都应避免在一般情况下不推荐使用且不可靠-a/-o test运算符(如果您可以控制变量的内容,则不在这里)。