Bash脚本:使用单引号将变量输出到rm

Bash脚本:使用单引号将变量输出到rm,bash,Bash,我试图在bash脚本中将参数传递给rm,以自动清理系统。例如,我想删除除*.doc文件以外的所有文件。所以我写了以下代码 #!/bin/bash remove_Target="!*.txt" rm $remove_Target 然而,输出总是说 rm: cannot remove ‘!*.txt’: No such file or directory 显然,bash脚本在将变量传递给rm时为我添加了单引号。如何删除单引号?使用Bash 假设我们有一个包含三个文件的目录 $ ls a.py

我试图在bash脚本中将参数传递给rm,以自动清理系统。例如,我想删除除*.doc文件以外的所有文件。所以我写了以下代码

#!/bin/bash
remove_Target="!*.txt"
rm $remove_Target
然而,输出总是说

rm: cannot remove ‘!*.txt’: No such file or directory
显然,bash脚本在将变量传递给rm时为我添加了单引号。如何删除单引号?

使用Bash 假设我们有一个包含三个文件的目录

$ ls
a.py  b.py  c.doc
要删除除
*.doc
之外的所有文档,请执行以下操作:

$ shopt -s extglob
$ rm !(*.doc)
$ ls
c.doc
!(*.doc)
是一个扩展的shell glob,或
extglob
,它匹配除以
.doc
结尾的文件之外的所有文件

extglob功能需要一个现代的
bash

使用查找 或者:

find . -maxdepth 1 -type f ! -name '*.doc' -delete

以前有人问过这个问题:[在Linux shell中,如何删除目录中除一个或两个以外的所有文件][1][1]:引号只是错误消息的一部分。问题是该模式与任何文件都不匹配,因此它被直接传递到
rm
。谢谢@chepner。你是对的。单引号是来自rm的错误消息的一部分。我将脚本更改为rm!(*.txt)。它现在在命令行中工作,但在bash脚本中失败。感谢@AmirH的建议