如何在 Bash 中比较运算符左侧使用两个操作数

如何在 Bash 中比较运算符左侧使用两个操作数

这是:

3.8.13-68.3.4.el6uek.x86_64 #2 SMP Tue Jul 14 15:03:36 PDT 2015 x86_64 x86_64 x86_64 GNU/Linux

bash --version
    GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

我熟悉以下语法:

[ $VAR = "iotools" ] || [ $VAR_2 = "iotools" ]

其中要么$VAR应该包含 valueiotools要么$VAR_2应该包含 value iotools

有没有一种方法可以像下面这样写:

[ $VAR||$VAR_2 = "iotools" ]

这个想法是为了节省代码占用的空间并消除第二对方括号中的额外代码。

答案1

不,您不能缩短比较的左侧。但是,您可以在右侧使用模式:

[[ iotools == @("$VAR"|"$VAR_2") ]]

请注意,您需要使用[[ ... ]]而不是[ ... ]它才能工作。看模式匹配了解man bash详细信息。

应将变量加引号以防止VAR='a|iotools|b'匹配。

答案2

由于您使用的是 bash,因此可以使用两个概念来完成:

  • 有一种方法可以列出多个具有相似名称的变量:

    VAR=iotools
    VAR_2=tools2
    VAR_3=othertools
    
    printf '<%s> ' "${!VAR@}"
    

    将打印:

    <VAR> <VAR_2> <VAR_3>
    
  • 这也可以间接完成${!var}(var 是与 $VAR 不同的变量):

    for var in "${!VAR@}"; do
        printf '<%s> '  "${!var}"
    done
    

    将打印:

    <iotools> <tools2> <othertools>
    

全部加在一起将是:

#!/bin/bash

VAR=iotools
VAR_2=tools2
VAR_3=othertools

testvalue="$1"

for var in "${!VAR@}"; do
    if [[ ${!var} == $testvalue ]]; then
        echo "Some value matched"
        break
    fi
done

调用如下:

$ script iotools
Some value matched
$ script notool
$

相关内容