たとえば、次のようになります。
最初
cd /usr/lib
そして走る
for x in $(ls);do if [ "$x" == "*.a" ];then echo $x;fi;done
私がやりたいことは、拡張子が.aのファイルを選択して印刷することです。これを行うより簡単な方法があることを知っていますが、これは私の意図ではありません。
問題は、上記のコマンドが機能しないことです。理由はわかりません。私はこれを学んだこの投稿
私も試しました
[ "$x" == *.a ] bash: [: too many arguments
[ $x = "*.a" ] shows nothing
[ $x = *.a ] bash: [: too many arguments
うまくいくことはわかりますが、この状況でテストを書く正しい方法が何であるかを[[ $x == *.a ]]
知りたいです。[
答え1
for x in ./*; do
case $x in
*".a" ) echo "$x";;
esac
done
構造[
はこれに完全には適していません。しかし、あなたが主張するならば、私たちはこれを行うことができます:
[ '.a' = ".${x##*.}" ]
説明する
$ xに次のものが含まれていると仮定すると、my.file.testing.a
左${x##*.}
から始めてから.
見える最後の項目までできるだけ削除します$x
。 IOW、私たちはついにすべてを下ろし、extension
視覚化をa
前面に掲げました。今、私たちは.a
成功にもっと良いと思うもの( )と比較するために計算したばかりの拡張を持っています。
答え2
あなたの質問にリンクした答えはbash(二重括弧)を使用します。拡張テスト構文、POSIX単一の角かっこテスト演算子を使用しようとしています。違いは、二重角かっこテストでは、==
単語分割やグローバル拡張を行わずに、anの右側がパターンとして扱われることです。故にエラーが[ $f == *.a ]
発生しても[: too many arguments
可能する
for f in *; do if [[ $f == *.a ]]; then echo "$f"; fi; done
または(よりコンパクト)
for f in *; do [[ $f == *.a ]] && echo "$f"; done
またはを使用しているようなので、次の正規表現演算子をbash
使用できます。=~
for f in *; do if [[ $f =~ \.a$ ]]; then echo "$f"; fi; done
または(よりコンパクト)
for f in *; do [[ $f =~ \.a$ ]] && echo "$f"; done
この場合は過剰です。