Bash shell遍历目录时for循环未按预期运行问题排查
问题根因及解决方案
导致该现象的核心是Bash路径扩展(通配符展开)的规则和两台服务器的配置/环境差异,具体原因如下:
- 通配符被双引号包裹抑制了展开
你当前代码中"/dir_example/*"把通配符*放在了双引号内部,Bash的双引号仅允许变量替换、命令替换、算术替换生效,会默认抑制路径扩展的通配符解析,所以*会被当做普通字符处理。
如果你另一台服务器上该代码可以正常运行,大概率是该服务器的Bash开启了非标准的扩展配置,或者路径存在特殊匹配规则,该写法本身不符合Bash的通用语法规范。 - Bash运行时的glob选项配置不同
两台服务器的Shell选项差异也会导致行为不一致:- 如果当前服务器执行过
set -f(开启noglob选项),会全局关闭路径扩展功能,所有通配符都会原样输出,可执行set +f关闭该选项恢复功能。 - 默认状态下如果
/dir_example路径不存在,或者路径下没有任何可匹配的文件/目录,通配符会原样输出;如果另一台服务器上的/dir_example路径下存在匹配内容,且配置了shopt -s nullglob,也可能出现写法不标准但能正常运行的情况。
- 如果当前服务器执行过
- 路径权限问题
如果运行脚本的用户没有/dir_example的读取权限,Bash无法扫描路径下的内容,也会导致通配符无法展开直接原样输出。
正确的遍历写法
如果要兼容所有标准Bash环境,同时处理路径带空格的场景,推荐写法如下:
# 开启nullglob,匹配不到内容时不会保留通配符字符串 shopt -s nullglob # 仅把固定路径部分用双引号包裹,通配符放在引号外保证正常展开 for dirname in "/dir_example/"*; do echo "$dirname" done # 可选:执行完成后恢复nullglob的默认关闭状态 shopt -u nullglob
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

