説明する

説明する

たとえば、次のようになります。

最初

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

この場合は過剰です。

関連情報