Bash脚本如何为参数添加通配符扩展修复find查找异常
问题原因
故障核心是FILE="'*$FILE*'"这行赋值错误:你额外添加的单引号被当成了变量的实际内容存储,而不是Shell语法层面的字符串包裹符。
你在交互Shell中直接执行find 目标路径 -name '*test*'时,外层单引号是Shell解析用的语法标记,作用是告诉Shell不要提前展开*通配符,这对单引号本身不会作为参数传给find命令。但在脚本的赋值语句中,你把单引号写在了双引号包裹的赋值内容里,Shell会直接把这两个单引号识别为普通字符存入FILE变量,最终传递给find的-name参数真实值为'*test*'——也就是要求find匹配「文件名首尾带单引号、中间包含搜索关键词」的文件,当然匹配不到你想要的结果。你开-x调试参数看到的大量转义引号,就是Shell在调试输出中明确标识:这些单引号是参数内容的一部分,不是用来包裹字符串的语法符号。
修复方案
去掉赋值时多余的单引号,同时给所有变量引用加上双引号(避免搜索路径、关键词包含空格时出现参数拆分错误),修正后完整代码如下:
#!/bin/bash echo "" read -p "-Write file you need- " FILE read -p "-Write the folder to search- " FOLDER # 直接拼接通配符即可,不需要额外套单引号 FILE="*$FILE*" # 变量引用统一加双引号,兼容含空格的路径/文件名 find "$FOLDER" -name "$FILE"
提示:给变量引用加双引号是Bash脚本编写的通用最佳实践,可以规避绝大多数特殊字符、空格导致的执行异常。
调试现象补充说明
你之前加echo $FILE看到输出为'*test*',并不是变量里没有单引号,而是echo把变量中存储的单引号字符原样打印了出来——你看到的单引号是变量值本身的内容,不是echo输出时自动添加的语法标识。
内容的提问来源于stack exchange,提问作者Matías Mercado
相关产品推荐
相关产品推荐

