使用数组实现循环迭代生成Zip文件:脚本无报错但未生成文件
问题分析与解决
你的脚本未生成Zip文件,核心问题出在目录名的斜杠处理和Zip命令的递归参数上,以下是具体问题拆解和修复方案:
问题点梳理
- 无效的Zip文件名:
dirs=(*/)获取的目录名末尾带有斜杠(例如app-inbound/),拼接成"$sub_dir".zip后会变成app-inbound/.zip,属于不符合规范的文件名,系统无法正常创建。 - 缺少递归压缩参数:直接执行
zip 文件名 目录只会将目录本身(作为空条目)加入压缩包,不会递归压缩目录内的文件,若目录无内容则可能不生成有效Zip文件。 - 工作目录未恢复:脚本
cd "$d"后未返回初始目录,虽当前场景仅一层循环,但会导致后续操作的工作目录混乱,属于不良编码习惯。
修正后的脚本
#!/bin/bash start_dir=/tmp/Inbound echo "start_dir=$start_dir" # 保存初始工作目录,后续恢复 original_dir=$(pwd) for d in "$start_dir"/*/ ; do # 进入目标目录,失败则跳过当前循环(避免脚本直接终止) cd "$d" || continue dirs=(*/) declare -p dirs echo "Entering into location: $(pwd)" for sub_dir in "${dirs[@]}" do # 移除目录名末尾的斜杠 clean_sub_dir=${sub_dir%/} echo "Compressing $clean_sub_dir..." # 用-r参数递归压缩目录内容,指定合法的Zip文件名 zip -r "$clean_sub_dir.zip" "$clean_sub_dir" done # 回到初始工作目录 cd "$original_dir" || exit done
关键修改说明
- 去除目录末尾斜杠:通过
${sub_dir%/}截取目录名最后的斜杠,生成合法的Zip文件名(如app-inbound.zip)。 - 添加递归参数
-r:让Zip命令递归压缩目录内所有文件和子目录,生成包含内容的有效压缩包。 - 保存并恢复初始目录:避免脚本执行过程中工作目录漂移,提升脚本健壮性。
- 用
continue替代exit:若某一次cd失败,脚本不会直接终止,而是跳过当前循环继续执行后续逻辑。
内容的提问来源于stack exchange,提问作者Gowmi
相关产品推荐
相关产品推荐

