将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
发表回复