web-dev-qa-db-ja.com

bashスクリプトでファイル名のパターンマッチングを実行できますか?

Bashスクリプトでファイル名のパターンマッチングを実行できますか?

testは、次のファイルがあるディレクトリです...

bob@bob-laptop:~/test$ ls  
exclude  exclude1  exclude2  include1  include2  

コマンドラインから、一部のファイルを除外したい場合は、...

bob@bob-laptop:~/test$ echo !(exclude*)  
include1 include2  

しかし、そのコマンドをスクリプト(excludeという名前)に入れると...

bob@bob-laptop:~/test$ cat exclude  
echo !(exclude*)  

実行するとエラーになります...

bob@bob-laptop:~/test$ ./exclude  
./exclude: line 1: syntax error near unexpected token `('  
./exclude: line 1: `echo !(exclude*)'  

特殊文字の一部、すべて、またはなしをエスケープするすべての(私が思う)バリエーションを試しましたが、それでもエラーが発生します。

ここで何が欠けていますか?私がこれを行うことができない場合、誰かが理由を説明してくれますか?

3
Bob Bowden

スクリプトの先頭に Shebang 行を配置する必要があります。 Shebang行がないと、カーネルはスクリプトがbashで実行されなければならないことを知りません。参照 シェルスクリプトが失敗:構文エラー:“(”予期しない

さらに、!(…)構文は、歴史的な理由により、デフォルトでは有効になっていません(以前のバージョンのbashではサポートされていませんでした)。 extglobオプションを設定する必要があります。

#!/bin/bash
shopt -s extglob
echo !(exclude*)