ifとshoptを使用したLinuxシェルスクリプト

ifとshoptを使用したLinuxシェルスクリプト

次のシェルスクリプトを作成しました。

#!/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オプションを設定する

関連情報