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


129

この質問は私の以前の質問の一種の続編です。このサイトのユーザーはfor、文字列値を反復処理するbash ループの作成方法を決定してくれました。たとえば、ループ制御変数fnameが文字列を反復処理するとします"a.txt" "b.txt" "c.txt"echo「はい」にしたいです。when fnameが値"a.txt"or "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ときに、ステートメントが明らかにtrueを返すのはなぜですか?間違って使用しましたか?fname"a.txt"|


3
bashでは、「または」演算子は「||」です (Cスタイル)。
マリウスコトファナ

3
-o同じ内で使用することもできます[ ]
トール

6
@Thor は、4つ以上の引数をサポートすることが保証されていないという理由だけで、移植性のために好ん||で分離[ ]します。もちろん、ターゲット言語であれば、誰も使用してはなりませんので、とにかくさんは、多くの点で優れています。-o[bash[bash[[
jw013

2
@ jw013ありがとう。これは、私が使うif [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]よりも使うべきだということif [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]ですか?
アンドリュー

5
@Andrew bashあなたがすでにしているように、シェバンをとして宣言している場合、それは正しいです。利点の1つ[[は、単語の分割を行わない(特殊なケース)ため[[ $unquoted_var = string ]]、安全であることです。
jw013

回答:


229

言いたい場合はOR、二重パイプ(||)を使用します。

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

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


4
さらに、||標準的な論理「OR」を実行しません-短絡し、最初のコマンドが失敗した場合にのみ2番目のコマンドが実行されます。
holdenweb 16

13
@holdenweb最新の最適化された言語のほとんどが同じように機能すると確信しています。OR最初の条件がtrueと評価された場合、2番目の条件を評価するためにCPUサイクルを費やす必要はありません。
バハマ16

1
私はbashが好き==だと思っていましたが、この答えを見た後、調べることにしました。どうやら、「それは使用できますが、標準ではありません」。あなたの好奇心が強いなら、私はこれを他の人のためにここに置くと思った:stackoverflow.com/a/2237103
harperville

これはtestマニュアルページでも推奨されていることです
cdosborn

2
ダブルブラケットテストを使用することもできます- if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]](追加の機能を関連付けたい場合、または必要な場合[[ ]])。
HankCa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.