Bash的for循环如何识别通配符匹配到的变量对应的是文件?
Bash for循环匹配文件名的原理
这个功能并不是for循环自带的,本质是Bash的**通配符展开(globbing)**机制在for循环运行前就完成了文件名匹配,具体执行顺序如下:
- Bash解析命令时,会优先对没有被引号包裹的通配符做处理:你写的
t*里的*是通配符,会匹配当前工作目录下所有名称以t开头的文件、目录名,按字母排序后得到字符串列表t1 t2 t3 - 通配符展开完成后,Bash才会把展开后的结果传入
for循环,此时你输入的命令实际已经被替换为:
for x in t1 t2 t3 ; do echo $x ; done
for循环本身完全不知道这些值是文件名,它只是按顺序把列表里的每个字符串依次赋值给变量x,再执行循环体里的echo $x逻辑而已。
你可以做个简单验证:把t*用单引号包裹执行命令for x in 't*' ; do echo $x ; done,此时通配符会被转义不会触发展开,输出结果就只有t*这一个字符串,不会匹配任何文件名。
内容的提问来源于stack exchange,提问作者Grzegorz Wilanowski
相关产品推荐
相关产品推荐

