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的列位置会发生偏移,很容易取错值。
修复方案
首先修正所有语法问题:
- 把所有
if[的写法改成if [,确保if和[之间、[和判断条件之间、判断条件和尾部的]之间都保留空格 - 删除脚本里多余的行号标记
16. - 给所有变量引用加上双引号,避免带空格的文件名、空值触发错误
- 把老旧的反引号命令替换换成兼容性更好的
$()格式 - 把
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
相关产品推荐
相关产品推荐

