echoは、ファイルのリストやプレーンテキストを出力する時期をどのように識別しますか?

echoは、ファイルのリストやプレーンテキストを出力する時期をどのように識別しますか?

テストでこの問題がありました。コレクション(a、e、i、o、u、e)で始まり、数字で終わり、少なくとも3文字のすべてのディレクトリをecho出力します。簡単だと思いましたが、すぐに混乱してしまい、結局失敗しました。私の最初の考えは簡単でした。

echo {a,e,i,o,u,e}*{0..9}

それから角かっこを使ってみました。

echo [a,e,i,o,u,e]*[0..9]

最後に、私は次のことを試しました。

echo $(ls {a,e,i,o,u,e}*{0..9})

これにより、目的の結果が得られますが、一部のエラーディレクトリにメッセージがありません。これを実行するために他の機能を使用しているため、不正行為と見なされないかどうかはわかりません。

誰でもこれを明確にするのに役立ちますか?これをどのように実行し、いつどの括弧を使用する必要がありますか?また、echoが正しい単語の代わりにディレクトリリストを出力する必要がある場合をどのように認識するのかを知りたいです。

答え1

延長するMosviの口コミそしてEmma Luoの説明、私が提案する:

echo [aeiou]?*[0-9]/

これは、要件を満たすためにファイル名拡張子(グローバル)機能を使用します。

  • ディレクトリまたはディレクトリへのシンボリックリンク(末尾のスラッシュ/
  • 英語の小文字の集まり([aeiou])で始まる
  • 1つ以上の追加文字が含まれています(?)。
  • そして持って少なくとも3文字(*0個以上の文字に一致し、以下のように既に一致した2文字と一致した最後の文字に追加されます)
  • 小数点以下の桁数 ( [0-9]) で終わります。

シェルは、一致するすべてのディレクトリ名を拡張してに渡しますecho。その後、再びエコーされます。

bashただし、以下を含む一部のシェルの場合いいえディレクトリが要件を満たしている場合、シェルはパターンを保持し、それをパターンに直接渡します。echoこれによりパターンが再びエコーされ、次のような出力が生成されます。

【エイオウ】? *[0-9]/

bashで "nullglob"オプションを設定することで、少し調整できます。このオプションは、bashに一致する(null)エントリがない場合(glob)、削除するモードでは何も渡されず、空行だけがecho印刷されます。または、failglob失敗したglobのオプションを使用してエラーをトリガーします。

関連情報