Shell脚本中通配符*无法匹配文件名问题求助
问题原因与解决办法
原因
直接将带通配符*的路径赋值给变量时,Shell不会自动展开通配符,只会把整个字符串原样存入变量,所以INPUT_PATH里会保留*字符,不会替换成实际文件名。
解决方法
1. 用数组存储匹配的文件
把路径用数组赋值,Shell会自动展开通配符,将所有匹配的文件名存入数组:
INPUT_PATHS=(/group/had/muon/cometmgr/MC6/MC6A01/rootracker/oa_g4_proton_00000$(printf %03d ${j})*.rootracker)
之后遍历数组处理文件:
for file in "${INPUT_PATHS[@]}"; do # 这里写你的文件处理逻辑,比如打印文件名 echo "$file" done
2. 直接在循环中使用通配符
跳过变量赋值环节,直接把带通配符的路径放到循环里,Shell会自动展开:
for file in /group/had/muon/cometmgr/MC6/MC6A01/rootracker/oa_g4_proton_00000$(printf %03d ${j})*.rootracker; do # 文件处理逻辑 echo "$file" done
3. 处理无匹配文件的情况
如果担心没有匹配文件时,Shell会把带*的字符串当作无效文件名,可以开启nullglob选项,让无匹配时返回空:
shopt -s nullglob INPUT_PATHS=(/group/had/muon/cometmgr/MC6/MC6A01/rootracker/oa_g4_proton_00000$(printf %03d ${j})*.rootracker) shopt -u nullglob # 用完后可以关闭该选项
内容的提问来源于stack exchange,提问作者user17780852
相关产品推荐
相关产品推荐

