Bashで比較演算子の左側に2つのオペランドを使用する方法

Bashで比較演算子の左側に2つのオペランドを使用する方法

これは:

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" ]

valueを$VAR含めるか、valueを含める必要があります。iotools$VAR_2iotools

以下のように書く方法はありますか?

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

アイデアは、コードが占めるスペースを節約し、2番目の角かっこ内の余分なコードを削除することです。

答え1

いいえ、比較の左部分を減らすことはできません。ただし、右側のパターンを使用できます。

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

この機能を機能させるには、代わり[[ ... ]]に使用する必要があります。[ ... ]バラよりパターンマッチングもっと学ぶman bash

一致を防ぐには、変数を引用符で囲む必要がありますVAR='a|iotools|b'

答え2

Bashを使用しているので、次の2つの概念を使用してこれを実行できます。

  • 同様の名前を持つ複数の変数を一覧表示する方法があります。

    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
$

関連情報