この質問は私の 前の質問 の続編です。このサイトのユーザーは、文字列値を反復処理する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になるのはなぜですか? |
を間違って使用しましたか?
OR
と言いたい場合は、二重パイプ(||
)を使用してください。
if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]
(|
を使用する元のOPコードは、通常のパイプが機能するのと同じように、左側の出力を右側にパイプするだけでした。)
受け入れられた答えは良いですが、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を評価しません。
次のようなものはどうですか:
if [ a = b ] || [ c = d && e = f]
構文は注意が必要です...
このように使用または調整できます
if [ "$fname" = "a.txt" -o "$fname" = "c.txt" ]