Cygwin下Bash脚本自动加单引号致rm命令失效,如何解决?
解决Cygwin中Bash脚本无法删除指定txt文件的问题
核心原因:你用了bash -f执行脚本
bash的-f选项会直接禁用文件名通配(globbing),也就是说脚本里的*.txt不会被shell自动展开成所有txt文件名,而是被当成一个叫*.txt的字面文件名传给rm,自然删不到目标文件——set -x显示的单引号是shell用来标记“这是字面量”的,不是你手动加的引号。
最直接的解决办法:去掉-f执行脚本
直接用正常方式运行脚本就行:
bash myfile.sh
或者先给脚本加执行权限,直接运行:
chmod +x myfile.sh ./myfile.sh
要是必须用-f选项,手动处理通配符
如果因为某些限制必须带-f执行,那就在脚本里手动展开通配符,比如用数组或者循环:
方法1:用数组展开
修改脚本为:
#!/bin/bash set -x # 手动把通配符展开成文件列表 files=(/home/user/*.txt) rm -rf "${files[@]}"
方法2:用循环逐个处理
这种方式还能避免没有txt文件时报错:
#!/bin/bash set -x for file in /home/user/*.txt; do # 跳过不存在的文件(防止没有txt文件时rm报错) [[ -e "$file" ]] && rm -rf "$file" done
额外检查:确认路径和文件存在
可以先在脚本里加一行验证,确保目标目录和文件确实存在:
#!/bin/bash set -x # 先检查目录是否存在 if [[ ! -d "/home/user/" ]]; then echo "目录/home/user/不存在" exit 1 fi # 先列出文件,确认通配符能生效 ls /home/user/*.txt rm -rf /home/user/*.txt
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

