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

UNIX bash脚本16行报syntax error near unexpected token错误

报错根因

你遇到的syntax error near unexpected token 'then'语法错误,核心原因是违反了bash的基础语法规则:

  • if是独立的shell关键字,和后面的条件判断命令之间必须用空格分隔
  • 脚本里写的if[属于连写错误,shell会把if[识别成一个不存在的自定义命令,解析到后续的then关键字时就会判定语法非法,直接抛出错误。

除此之外你的脚本还有几个会导致运行异常的问题:

  • 第16行行首的16.是标注行号加的内容,实际运行的脚本里必须删掉,否则也会触发命令不存在的错误
  • 所有变量引用、[ ]判断的边界都没有加空格、加引号防护,遇到带空格的文件名、空值场景会直接运行失败
  • 用ls遍历文件、解析ls -l输出取时间字段的写法兼容性极差,不同操作系统、不同语言环境下ls -l的列位置会发生偏移,很容易取错值。
修复方案

首先修正所有语法问题:

  1. 把所有if[的写法改成if [,确保if和[之间、[和判断条件之间、判断条件和尾部的]之间都保留空格
  2. 删除脚本里多余的行号标记16.
  3. 给所有变量引用加上双引号,避免带空格的文件名、空值触发错误
  4. 把老旧的反引号命令替换换成兼容性更好的$()格式
  5. 把ls遍历文件的逻辑改成shell原生通配符*遍历,避免特殊文件名解析错误

修正后可正常运行的脚本如下:

#!/bin/bash

if [ -f modified ]
then
    rm modified
fi
touch modified

muajt=$(date | awk '{print $2}')
ditet=$(date | awk '{print $3}')

for fajlli in *
do
    if [ -f "$fajlli" ]
    then
        muj=$(ls -l "$fajlli" | awk '{print $7}')
        dit=$(ls -l "$fajlli" | awk '{print $8}')
        if [ "$muajt" = "$muj" -a "$ditet" = "$dit" ]
        then
            echo "$fajlli" >> modified
        fi
    fi
done

优化提示:如果要更稳定的获取文件修改时间,不要解析ls -l的输出,建议用系统自带的stat命令直接读取文件元数据,比如GNU版本的stat可以用stat -c "%m" "$fajlli"直接拿到修改时间的月份,不会受输出格式、语言环境影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 08:33:20