我试图删除bash脚本中的一些文件并排除一些我之后仍然需要的文件。这就是我想出的:
if [ $var1 -eq 0 ]; then
echo "$var1 = 0"
shopt -s extglob
rm /home/someone/!(file1.txt|file2.png|file3.pdf|file4.csv)
else
echo "$var1 = 1"
shopt -s extglob
rm -rf /home/someone/!(file1.txt|file2.png|file3.pdf|file4.csv)
fi
如果我在shell上手动执行它,它会工作,但在脚本中它甚至不会调用if循环。一旦我注释掉包含“!”的行它有效。
答案 0 :(得分:1)
您无法在块或函数中转换extglob
shell选项。例如,这将失败:
shopt -u extglob
f() {
shopt -s extglob
echo *+(a)*
}
f
原因是在解析块时不执行命令shopt -s extglob
...因此解析器在遇到扩展的glob +(a)
时会抱怨。见the relevant section of the glob
page on Greg's wiki:
extglob
更改了解析某些字符的方式。在shopt -s extglob
和任何后续命令之间使用它有必要使用换行符(不仅仅是分号)。您无法在使用它们的组命令中启用扩展globs,因为整个块都已解析在评估shopt
之前。请注意,典型的函数体是一个组命令。令人不快的解决方法可能是使用子shell命令列表作为函数体。
但是,如果你真的想要这种行为,可以使用eval
,但实际上根本不推荐!相反,将shopt -s extglob
移出块。实际上,习惯上将shell选项放在脚本的开头并在整个脚本中使用它们(如果适用)。如果您在整个脚本中使用extglob
,我认为您不会遇到任何问题。
答案 1 :(得分:0)