Bashスクリプトは、「if」ステートメントに条件付き「or」を使用します。

Bashスクリプトは、「if」ステートメントに条件付き「or」を使用します。

この質問は私の質問の後継です。前の質問。このサイトのユーザーは、for文字列値を繰り返すbashループを作成する方法を見つけるのに親切に役立ちました。たとえば、ループ制御変数がfname文字列を繰り返すとします"a.txt" "b.txt" "c.txt"。値がある場合はecho「はい!」が欲しく、そうでなければ「いいえ!」が必要です。次のbashシェルスクリプトを試しました。fname"a.txt""c.txt"echo

#!/bin/bash

for fname in "a.txt" "b.txt" "c.txt"
do
  echo $fname
  if [ "$fname" = "a.txt" ] | [ "$fname" = "c.txt" ]; then
    echo "yes!"
  else
    echo "no!"
  fi
done

私は出力を取得します:

a.txt

いいえ!

b.txt

いいえ!

c.txt

はい!

ifこのステートメントに値がありますが、なぜ明らかに真になるのですか?私が間違って使用したのでしょうか?fname"a.txt"|

答え1

言いたい場合は、ORダブルパイプ(||)を使用してください。

if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]

(もともと使用されたOPコードは、|通常のパイプが動作するのと同じ方法で出力を左から右に単にパイプしました。)


長年のコメントと誤解の終わりに、私は明確に説明します。

ORあなたの使用のために||

使用するかどうかは[状況[[によって異なりますtest((すべての状況で、どちらかが好ましいと言うのは間違っています。時には[当たる時もあり、[[間違った時もあります。しかし、それは問題ではありません。 OPはなぜ|動作しないのか尋ねました。答えはその||逆でなければならないからです。

答え2

許可された答えは素晴らしいですが、bashを使用しているので、bashソリューションを追加します。

if [[ "$fname" == "a.txt" || "$fname" == "c.txt" ]]; then

これはbashリファレンスマニュアルに文書化されています。3.2.4.2 条件付き構成

式1&&式2

式1と式2の両方が真であれば真です。

式1 ||式2

式1または式2がtrueの場合はtrueです。

&&と||演算子は、式 1 の値が条件式全体の戻り値を決定するのに十分な場合、式 2 を評価しません。

答え3

このようにOR条件を使用することもできます。

if test "$fname" = "a.txt" || test "$fname" = "c.txt"

答え4

このように使用または調整できます

 if [ "$fname" = "a.txt" -o "$fname" = "c.txt" ]

関連情報