Posix shell脚本函数如何接收任意数量文件参数执行压缩上传
改造后可直接运行的完整代码
#!/bin/sh COMPRESSION=true FILE="test.json" LOG_FILE="test.log" # 入参为单个文件路径,输出压缩后的文件路径,压缩失败返回原路径 compress_file() { local input_file="$1" gzip "$input_file" if [ -f "${input_file}.gz" ]; then echo "${input_file}.gz" else echo "$input_file" fi } # 支持传入任意数量的文件路径作为参数,逐个处理压缩+推送 push_file() { # 遍历所有传入的参数 for original_file in "$@"; do # 跳过不存在的文件 if [ ! -f "$original_file" ]; then echo "跳过不存在的文件:$original_file" >&2 continue fi local target_file="$original_file" local content_type="application/json" if [ "$COMPRESSION" = "true" ]; then target_file=$(compress_file "$original_file") content_type="application/gzip" fi # 拼接存储地址,用basename取文件名避免多文件推送覆盖,可根据自身存储规则修改 STORAGE_URL="https://somepath/$(basename "$target_file")" TIMESTAMP=$(date -u '+%a, %d %b %Y %T GMT') curl --fail --silent --show-error -X PUT \ -T "$target_file" \ -H "Content-Type: $content_type" \ -H 'x-ms-version: 2020-02-10' \ -H "x-ms-date: $TIMESTAMP" \ "$STORAGE_URL" done }
核心改动说明
- 移除全局变量依赖:
compress_file改为接收输入文件作为参数,压缩后直接输出结果路径,和业务逻辑完全解耦 - 支持多入参处理:
push_file通过"$@"获取所有传入的参数,循环处理每个文件,入参数量无上限 - 补全异常兼容:新增文件存在性校验,所有变量都加了双引号,避免文件名带空格、特殊字符时执行出错
- 修复原代码逻辑漏洞:移除了无意义的嵌套
cmd函数,补全了实际执行的推送逻辑,新增文件名拼接避免多个文件推送时地址冲突覆盖 - 可扩展优化点:如果需要推送非json格式的文件,可把固定的
content_type改为content_type=$(file -b --mime-type "$original_file")自动识别文件类型
使用方法
- 同时压缩推送两个文件:执行
push_file "$FILE" "$LOG_FILE" - 仅压缩推送单个文件:执行
push_file "$FILE" - 推送更多文件直接往
push_file后追加路径参数即可
内容的提问来源于stack exchange,提问作者cynicalswan77
相关产品推荐
相关产品推荐

