You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 19:36:00