如何在Shell文件循环中将扩展名设置为可配置变量?
解决方法
下面提供两种实用的实现方式,适配不同的变量定义习惯:
方式1:直接用数组定义扩展名(推荐)
数组是Shell里处理多元素最稳妥的方式,能避免字符串分割的潜在问题:
# 定义支持的扩展名数组 extensions_supported=(docx doc pdf) # 开启nullglob:如果没有匹配的文件,模式会被忽略(避免出现类似"*.docx"的无效文件名) shopt -s nullglob for ext in "${extensions_supported[@]}"; do for file in "$folder/"*."$ext"; do process "$file" done done # 可选:如果需要恢复nullglob的默认设置,可执行 # shopt -u nullglob
方式2:用逗号分隔的字符串变量
如果一定要用逗号分隔的形式定义变量,可以先把字符串转成数组再处理:
# 逗号分隔的扩展名变量 extensions_supported="docx,doc,pdf" # 临时修改IFS为逗号,将字符串分割成数组 IFS=, read -r -a ext_array <<< "$extensions_supported" shopt -s nullglob for ext in "${ext_array[@]}"; do for file in "$folder/"*."$ext"; do process "$file" done done
注意事项
shopt -s nullglob很关键:如果某个扩展名在目标文件夹下没有对应文件,开启这个选项后,循环会直接跳过该扩展名,而不是把"$folder/"*.xxx作为无效文件名传给process命令。- 变量和数组的引用都用双引号包裹,避免文件名包含空格、特殊字符时出现解析错误。
内容的提问来源于stack exchange,提问作者theprof86
相关产品推荐
相关产品推荐

