次のシェルスクリプトを作成しました。
#!/bin/bash
...
#delete downloaded file
if [ "$param" == "delete" ]; then
shopt -s extglob
cd $DataPersistent/download/
rm -f !($label.*)
cd $DataPersistent/swm/install_pkg/
rm -rf !($label|$label.json|active.json)
shopt -u extglob
fi
...
そのステートメントを削除するとif
正常に機能しますが、追加するとif
次のエラーが発生します。
/usr/local/bin/clear.sh: line 17: syntax error near unexpected token `('
/usr/local/bin/clear.sh: line 17: ` rm -f !($label.*)'
原因は何ですか?どうすれば解決できますか?
答え1
shopt -s extglob
シェルの構文を変更します。このステートメントがない場合、拡張ワイルドカードパターン!($label|$label.json|active.json)
は無効な構文です。
問題は、シェルがシェルオプションをshopt
有効にしてコマンドを実行する前に、extglob
完全なif
仕様解析中に構文エラーが検出されました。
許可された構文を変更する必要がある行が複合コマンド(つまりステートメント)if
の一部ではない場合、shopt
コマンドはすでに有効になっているためextglob
機能します。
この問題を解決するには、ドアの前に有効にしてからextglob
無効if
にします。
これはここで見つかったのと同じ問題です。複合コマンドでbashオプションを設定する