「myfile」以外の現在のディレクトリのすべてのエントリを削除するには、次のようにします。
rm -r !("myfile")
cleanup
しかし、スクリプト(と呼ばれる)に入れると、次のようになります。
#!/bin/bash
rm -r !("myfile")
私は得る:
pi@raspberrypi:~/tmp $ ./cleanup
./cleanup: line 2: syntax error near unexpected token `('
./cleanup: line 2: `rm -r !("file2")'
走れば
ps -p $$
私の端末がbashを使用しているのがわかります。
PID TTY TIME CMD
1345 pts/3 00:00:02 bash
だから問題が何であるかよくわかりません。
メモ:
- 私は気づいたもしスクリプトは実際に動作し、それ自体が削除されます。したがって、私のスクリプトは実際には次のように見えますが、
rm -r !("cleanup"|"myfile")
エラーメッセージは同じです。 - ブロック引用符が示すように、これはDebianベースのRaspbianオペレーティングシステム(9-stretch)です。
- この質問は重複しているようですが、見つかりませんでした。似た名前があります。質問しかし、変数の継承に関するものなので、問題は解決されません。
答え1
パターンは!(pattern-list)
グローバル拡張。多くのディストリビューションでは、対話型シェルではこれを有効にしますが、非対話型シェルでは有効にしません。確認できます
$ shopt extglob
extglob on
$ bash -c 'shopt extglob'
extglob off
スクリプトを変更するには、スクリプトを有効にする必要があります。
shopt -s extglob
その始めに。
答え2
ここで使用するのは拡張ワイルドカード機能です。
Bashman
ページから:
If the extglob shell option is enabled using the shopt builtin, several extended pattern matching operators are recognized. In the following description, a pattern-list is a list of one or more patterns separated by a |. Composite patterns may be formed using one or more of the following sub-patterns:
[...]
!(pattern-list) Matches anything except one of the given patterns
このコマンド制御可能シェルオプションはshopt
対話型シェルではデフォルトで有効になっていますが、非対話型シェル(スクリプト)ではデフォルトで無効になっています。
有効にするにはを使用しますshopt -s extglob
。