json格式化脚本

·

将1个tab转换为2个空格。支持单文件和文件夹输入。使用的是ash,适用于openwrt。

#!/bin/ash

# 检查是否安装了 jq
if ! command -v jq > /dev/null 2>&1; then
    echo "错误: 系统未安装 jq,请先安装(OpenWrt 请运行: opkg update && opkg install jq)"
    exit 1
fi

# 处理参数:如果未指定参数,则默认使用当前目录并转换为绝对路径
if [ -z "$1" ]; then
    TARGET="$(pwd)"
else
    # 如果指定了参数,也将其转换为绝对路径(方便后续打印)
    TARGET_DIR=$(dirname "$1")
    TARGET_BASE=$(basename "$1")
    if [ -d "$1" ]; then
        TARGET="$(cd "$1" && pwd)"
    elif [ -d "$TARGET_DIR" ]; then
        TARGET="$(cd "$TARGET_DIR" && pwd)/$TARGET_BASE"
    else
        TARGET="$1" # 如果路径不存在,直接保留原样,后续交给逻辑去报错
    fi
fi

# 核心格式化函数
format_single_json() {
    local json_file="$1"
    local tmp_file="${json_file}.tmp"

    if jq --indent 2 '.' "$json_file" > "$tmp_file" 2>/dev/null; then
        mv "$tmp_file" "$json_file"
        echo "[成功] 已格式化: $json_file"
    else
        rm -f "$tmp_file"
        echo "[失败] 语法错误: $json_file"
    fi
}

# --- 逻辑判断分流 ---

if [ -f "$TARGET" ]; then
    # 情况一:指定的是具体文件
    echo "正在格式化单个文件: $TARGET ..."
    format_single_json "$TARGET"

elif [ -d "$TARGET" ]; then
    # 情况二:指定的是目录(包括默认的当前绝对路径目录),弹出交互提示
    echo "警告: 你选定的是目录 [$TARGET]"
    printf "将修改该目录内所有的 .json 文件格式,是否继续?(y/N): "
    read -r CONFIRM

    case "$CONFIRM" in
        [yY]|[yY][eE][sS])
            echo "--------------------------------------------------"
            echo "开始处理目录下的所有 JSON 文件..."

            # 使用 find 查找并处理
            find "$TARGET" -type f -name "*.json" | while read -r json_file; do
                format_single_json "$json_file"
            done

            echo "--------------------------------------------------"
            echo "完成: 目录内所有 JSON 文件处理完毕!"
            ;;
        *)
            echo "操作已取消。"
            exit 0
            ;;
    esac

else
    echo "错误: [$TARGET] 不是有效的路径或文件不存在!"
    exit 1
fi

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注