1. ホーム
  2. バッシュ

[解決済み】Bashの簡単な論理演算子

2022-03-30 17:28:49

質問

私はいくつかの変数を持っており、次の条件をチェックしたい(言葉で書き出すと、私のbashスクリプトの試みは失敗しました)。

if varA EQUALS 1 AND ( varB EQUALS "t1" OR varB EQUALS "t2" ) then 

do something

done.

そして、失敗作の中で、私はこう考えました。

if (($varA == 1)) && ( (($varB == "t1")) || (($varC == "t2")) ); 
  then
    scale=0.05
  fi

解決方法は?

あなたが書いたものは、実際にはほとんど動作しますが(変数がすべて数字であれば動作します)、慣用的な方法とはまったく言えません。

  • (…) 括弧内は サブシェル . その中にあるのは、他の多くの言語のような式ではありません。これはコマンドのリストである(括弧の外側と同じ)。これらのコマンドは別のサブプロセスで実行されるので、括弧の中で行われたリダイレクトや代入などは括弧の外には影響しない。
    • 先頭がドル記号の場合。 $(…) コマンド置換 : 括弧の中にコマンドがあり、コマンドからの出力がコマンドラインの一部として使用されます (置換が二重引用符の間にある場合を除き、余分な展開の後ですが、その場合は 別件 ).
  • { … } 中括弧は、コマンドをグループ化するという点では括弧と同じですが、グループ化ではなく、解析にのみ影響します。プログラム x=2; { x=4; }; echo $x は4を表示するのに対し x=2; (x=4); echo $x また、中括弧はスペースを入れ、閉じる前にセミコロンが必要ですが、括弧は必要ありません。これは単なる構文の癖です)。
    • 先頭がドル記号の場合。 ${VAR} パラメータ展開 変数の値に展開され、さらに変換が可能です。
  • ((…)) を二重括弧で囲みます。 算術演算命令 他のプログラミング言語に似た構文で、整数の計算を行います。この構文は主に代入や条件文に使われる。
    • 算術式でも同じ構文が使われます $((…)) は、式の整数値に展開される。
  • [[ … ]] 二重括弧で囲む 条件式 . 条件式は、主に 演算子 のような -n $variable で変数が空かどうかをテストし -e $file は、ファイルが存在するかどうかをテストするために使用します。また、文字列の等値演算子もあります。 "$string1" == "$string2" (右辺がパターンであることに注意してください、例えば [[ $foo == a* ]] は、次のようにテストします。 $foo で始まる a 一方 [[ $foo == "a*" ]] テスト if $foo はまさに a* ) と、おなじみの ! , &&|| 演算子で否定、接続、論理和を、括弧でグループ化を行います。各演算子の周りには空白が必要なことに注意してください(例. [[ "$x" == "$y" ]] ではなく [[ "$x"=="$y" ]] のような文字)、そしてスペースまたは ; は,括弧の内側と外側の両方にある(例. [[ -n $foo ]] ではなく [[-n $foo]] ).
  • [ … ] は条件式の代替形式であり、より癖があります(しかし、より古く、より移植性があります)。今は何も書かず、それを含むスクリプトを見つけたときに気にするようにしましょう。

これは、bashでテストを書くときの慣用的な方法です。

if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then

他のシェルへの移植性が必要な場合は、このようにします (個々のテストを囲む追加の引用符と個別の括弧のセット、そして伝統的な = 演算子ではなく、ksh/bash/zshの == のバリアント)。

if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then