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 ],缺少左操作数 - 变量包含空格且未加引号,被拆分为多个无效参数
修复方案
- 始终给变量加双引号,避免空格或空值破坏参数结构:
if [ "$days" -gt 0 ] && [ -d "$dir" ]; then # 执行删除逻辑 fi
- 提前校验行格式,确保字段有效:
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
相关产品推荐
相关产品推荐

