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


11

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'

手伝ってくれますか?


回答:


23

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

インタラクティブbashインスタンスでは、シェルオプションextglobはonです。

$ 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

これを実行せずに同じことを行うコマンドを変更できますか?shopt -s extglob
タル

@Tal編集内容を確認してください。
heemayl

1
ありがとう:)(スタックの欠陥により、コメントに15文字を書くようになりました:( :( :()
Tal

しかし、ここには2つの良い答えがあります!
タル

1
これは実際に質問に答えるので、受け入れられた答えである必要がありますが、もう一方は回避策を説明するだけです。
Guntram Blohmは、モニカをサポートします

4

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

find代わりに使用できます

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

2

有効extglobにする必要があります:

shopt -s extglob

1
@ Pilot6:を参照してくださいman bash。のような拡張グロビングを可能にします!(...)
チョロバ

これを実行せずに同じことを行うコマンドを変更できますか?shopt -s extglob
タル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.