Git Bash遍历JPEG图片压缩脚本报错:变量未匹配实际文件
解决Bash脚本中通配符未匹配文件的问题
这个问题我之前也踩过坑!当你用*.jpeg作为循环变量时,如果当前目录里没有任何.jpeg后缀的文件,Bash不会自动展开通配符,而是把*.jpeg当作一个字面量字符串处理,这就导致了后面convert命令找不到文件的错误。
下面给你几个实用的解决方案:
1. 开启nullglob选项(推荐)
Bash有个nullglob选项,开启后如果通配符匹配不到任何文件,会直接移除这个模式,循环根本不会执行,也就不会报错了。修改后的脚本如下:
#!/bin/bash # 开启nullglob,避免通配符未匹配时保留字面量 shopt -s nullglob for f in *.jpeg; do echo "Processing $f file.." # 这里建议不要直接覆盖原文件,先输出到带后缀的文件更安全 convert -quality 85% "$f" "${f%.jpeg}_compressed.jpeg" # 如果一定要覆盖原文件,可以用临时文件过渡,防止转换失败丢失原文件: # convert -quality 85% "$f" "$f.tmp" && mv "$f.tmp" "$f" done # 可选:关闭nullglob恢复默认行为 shopt -u nullglob
2. 先检查文件是否存在
如果不想修改Bash的默认选项,可以在循环里先判断当前的$f是不是真实存在的文件:
#!/bin/bash for f in *.jpeg; do # 只有当$f是真实文件时才处理 if [[ -f "$f" ]]; then echo "Processing $f file.." convert -quality 85% "$f" "$f" fi done
3. 匹配更多可能的图片后缀
有时候目录里的图片可能是.jpg(小写)或者.JPEG(大写),可以用扩展通配符匹配多种后缀:
#!/bin/bash shopt -s nullglob # 匹配jpeg、jpg以及它们的大写形式 for f in *.{jpeg,jpg,JPEG,JPG}; do echo "Processing $f file.." convert -quality 85% "$f" "${f%.*}_compressed.${f##*.}" done shopt -u nullglob
最后提醒一句:直接用convert覆盖原文件有风险,如果转换过程中出错,原文件可能损坏,所以优先用临时文件或者新文件名的方式处理哦!
内容的提问来源于stack exchange,提问作者nikksan
相关产品推荐
相关产品推荐

