Bash中变量内通配符在ls命令中失效的原因排查
通配符存入变量后
ls无法匹配文件的原因及解决办法 问题原因
核心在于Bash的通配符展开时机:
- 直接输入带
*的路径时,Bash会先执行路径扩展,把*替换成所有匹配的实际文件/目录路径,再把这些路径传给ls命令,所以能正常找到文件。 - 用双引号
" "把带*的字符串赋值给变量时,Bash会将*视为普通字符,不会进行路径扩展。执行ls "$qq"时,双引号再次阻止了通配符扩展,ls会尝试寻找名字中包含*字符的文件,自然找不到匹配项——从echo "$qq"的输出也能看出,变量里存的就是带*的原始字符串。
解决办法
方法1:赋值时不使用双引号(直接展开通配符)
如果不需要保留变量中的通配符原始字符串,赋值时去掉双引号,让Bash直接完成路径扩展:
qq=/home/sims/data/202301*/Config/eNB/external-eutran-cell-fdd-logic* ls "$qq"
这种方式下变量会存储所有匹配到的文件路径,ls能正常处理。
方法2:用eval强制扩展通配符(谨慎使用)
如果必须先存储带通配符的字符串,之后再扩展,可以用eval命令强制Bash重新解析字符串并执行路径扩展:
qq="/home/sims/data/202301*/Config/eNB/external-eutran-cell-fdd-logic*" eval ls "$qq"
⚠️ 注意:eval会执行字符串中的任意命令,若变量内容来自不可信输入,可能存在安全风险。
方法3:用数组存储匹配结果(推荐)
更安全且能处理含空格文件名的方式,是用数组存储通配符匹配到的所有文件:
files=(/home/sims/data/202301*/Config/eNB/external-eutran-cell-fdd-logic*) ls "${files[@]}"
数组会分别存储每个匹配到的文件路径,展开数组时能正确处理含特殊字符的文件名。
内容的提问来源于stack exchange,提问作者HattrickNZ
相关产品推荐
相关产品推荐

