この質問は私の以前の質問の一種の続編です。このサイトのユーザーは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スタイル)。
—
マリウスコトファナ
-o同じ内で使用することもできます[ ]。
@Thor は、4つ以上の引数をサポートすることが保証されていないという理由だけで、移植性のために好ん
—
jw013
||で分離[ ]します。もちろん、ターゲット言語であれば、誰も使用してはなりませんので、とにかくさんは、多くの点で優れています。-o[bash[bash[[
@ jw013ありがとう。これは、私が使う
—
アンドリュー
if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]よりも使うべきだということif [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]ですか?
@Andrew
—
jw013
bashあなたがすでにしているように、シェバンをとして宣言している場合、それは正しいです。利点の1つ[[は、単語の分割を行わない(特殊なケース)ため[[ $unquoted_var = string ]]、安全であることです。