web-dev-qa-db-ja.com

予期しないトークン `( '付近の構文エラー

Ubuntuターミナルで以下のコードを使用すると、正常に動作します。

rm !(*.sh) -rf

しかし、同じ行コードをシェルスクリプト(clean.sh)に配置して、ターミナルからシェルスクリプトを実行すると、エラーがスローされます。

clean.shスクリプト:

#!/bin/bash
rm !(*.sh) -rf

私が得るエラー:

./clean.sh: line 2: syntax error near unexpected token `('
./clean.sh: line 2: `rm !(*.sh) -rf'

手伝ってくれますか?

11
Tal

rm !(*.sh)extglob構文です。これは、.sh拡張子を持つファイルを除くすべてのファイルを削除することを意味します。

インタラクティブbashインスタンスでは、シェルオプションextglobがオンになっています。

$ shopt extglob 
extglob         on

スクリプトがサブシェルで実行されているので、スクリプトの先頭にこれを追加してextglobを有効にする必要があります。

shopt -s extglob

したがって、スクリプトは次のようになります。

#!/bin/bash
shopt -s extglob
rm -rf -- !(*.sh)

編集:

.sh拡張ファイルを除くすべてのファイルを削除するには、GLOBIGNOREを使用します(extglobを有効にしたくない場合):

#!/bin/bash
GLOBIGNORE='*.sh'
rm -rf *

例:

$ ls -1
barbar
bar.sh
Egg
foo.sh
spam

$ GLOBIGNORE='*.sh'

$ rm *

$ ls -1
bar.sh
foo.sh
23
heemayl

わかりました、それはクロスポストですが、答えを書かなければなりません。 ;)

代わりにfindを使用できます

find . -maxdepth 1 ! -name '*.sh' -exec rm -rf {} \;
4
A.B.

extglobをオンにする必要があります。

shopt -s extglob
2
choroba