我编写了以下 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
启用extglob
shell 选项的命令之前,整个if
声明已经解析,并且发现语法错误。
当需要更改允许语法的行不是复合命令(这就是语句if
)的一部分时,该shopt
命令已经启用extglob
,这就是它起作用的原因。
要解决此问题,请在语句extglob
之前启用if
,然后禁用它。
这与此处也发现了同样的问题:在复合命令中设置 bash 选项