带有 if 和 shopt 的 linux shell 脚本

带有 if 和 shopt 的 linux shell 脚本

我编写了以下 shell 脚本:

#!/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更改 shell 的语法。如果没有此语句,扩展通配模式!($label|$label.json|active.json)是无效语法。

问题是,在 shell 执行shopt启用extglobshell 选项的命令之前,整个if声明已经解析,并且发现语法错误。

当需要更改允许语法的行不是复合命令(这就是语句if)的一部分时,该shopt命令已经启用extglob,这就是它起作用的原因。

要解决此问题,请在语句extglob之前启用if,然后禁用它。

这与此处也发现了同样的问题:在复合命令中设置 bash 选项

相关内容