web-dev-qa-db-ja.com

bashスクリプトで、条件付きの「or」を「if」ステートメントで使用する

この質問は私の 前の質問 の続編です。このサイトのユーザーは、文字列値を反復処理するbash forループの記述方法を決定するのを手伝ってくれました。たとえば、ループ制御変数fnameが文字列"a.txt" "b.txt" "c.txt"を反復処理するとします。 echoしたいと思います "はい!" fnameの値が"a.txt"または"c.txt"で、echo "no!"の場合さもないと。次のbashシェルスクリプトを試しました。

#!/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の値が"a.txt"であるときにfnameステートメントが明らかにtrueになるのはなぜですか? |を間違って使用しましたか?

183
Andrew

ORと言いたい場合は、二重パイプ(||)を使用してください。

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

|を使用する元のOPコードは、通常のパイプが機能するのと同じように、左側の出力を右側にパイプするだけでした。)

314
bahamat

受け入れられた答えは良いですが、bashを使用しているので、bashソリューションを追加します。

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

これはbashリファレンスマニュアルに記載されています .2.4.2条件付き構成体

式1 &&式2

Expression1とexpression2の両方がtrueの場合、trueです。

式1 ||式2

Expression1またはexpression2のいずれかが真の場合は真。

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

20
jesse_b

次のようなものはどうですか:

if [ a = b ] || [ c = d && e = f]

構文は注意が必要です...

0
Yamovitch

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

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