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

Korn Shell循环未执行命令求助:读取CFG清理旧文件失败

问题分析与解决方案

核心问题1:脚本仅读取CFG文件第一行,循环内命令未执行

Korn Shell中,若while循环内执行了会抢占标准输入的命令(如find、rm),或通过管道启动子shell执行循环,会导致循环的输入流被截断,仅能读取第一行就终止。

修复方案

使用文件描述符重定向绑定配置文件,避免与标准输入冲突,确保循环读取所有行:

# 将CFG文件绑定到文件描述符3,循环内通过<&3读取
while IFS=' ' read -r dir days <&3; do
    # 处理每行逻辑
done 3< "/path/to/your/config.cfg"

假设CFG格式为/目标路径 保留天数(每行两个字段),完整处理逻辑示例:

while IFS=' ' read -r dir days <&3; do
    # 跳过注释行(以#开头)
    [[ "$dir" =~ ^# ]] && continue
    # 验证目录存在后删除旧文件
    if [ -d "$dir" ]; then
        find "$dir" -type f -mtime +"$days" -delete
    else
        echo "目录 $dir 不存在" >&2
    fi
done 3< "/path/to/config.cfg"

其中IFS=' '用于拆分每行的路径和天数,-r避免转义字符被错误解析。

核心问题2:报错[52] [: argument expected

该错误由test命令(即[)的参数不完整导致,常见场景:

  • 天数变量为空,导致[ $days -gt 0 ]变成[ -gt 0 ],缺少左操作数
  • 变量包含空格且未加引号,被拆分为多个无效参数

修复方案

  1. 始终给变量加双引号,避免空格或空值破坏参数结构:
if [ "$days" -gt 0 ] && [ -d "$dir" ]; then
    # 执行删除逻辑
fi
  1. 提前校验行格式,确保字段有效:
while IFS=' ' read -r dir days <&3; do
    # 跳过空行或格式错误的行
    if [ -z "$dir" ] || [ -z "$days" ] || ! [[ "$days" =~ ^[0-9]+$ ]]; then
        echo "无效行: '$dir $days'" >&2
        continue
    fi
    # 后续处理逻辑
done 3< "/path/to/config.cfg"

用[[ "$days" =~ ^[0-9]+$ ]]校验天数为纯数字,避免非数字值导致的test错误。

完整可运行脚本示例

#!/usr/bin/ksh

CONFIG_FILE="/path/to/your/config.cfg"

# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
    echo "配置文件 $CONFIG_FILE 不存在" >&2
    exit 1
fi

# 读取配置文件并执行清理
while IFS=' ' read -r dir days <&3; do
    [[ "$dir" =~ ^# ]] && continue
    if [ -z "$dir" ] || [ -z "$days" ] || ! [[ "$days" =~ ^[0-9]+$ ]]; then
        echo "跳过无效行: '$dir $days'" >&2
        continue
    fi
    if [ ! -d "$dir" ]; then
        echo "目录 $dir 不存在,跳过" >&2
        continue
    fi
    echo "正在删除 $dir 中超过 $days 天的文件..."
    find "$dir" -type f -mtime +"$days" -delete
done 3< "$CONFIG_FILE"

echo "清理完成"

调试方法

执行脚本前添加set -x,查看详细执行过程,确认每行是否被读取、变量是否正确赋值:

set -x
./your_script.sh

内容的提问来源于stack exchange,提问作者STAKD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:52:19