Bash脚本定义time函数报错`syntax error near unexpected token ')'`求助
解决Bash脚本中
syntax error near unexpected token ')'的问题 核心错误原因
你遇到的语法错误是因为**time是Bash的内置命令**,用来统计命令执行耗时,不能直接用它作为自定义函数名。Bash解析时会把time (){判定为非法语法,因此抛出错误。
修复步骤及其他问题修正
除了函数名冲突,脚本里还有几处语法和逻辑问题,一起修正如下:
- 重命名冲突函数
将time函数改为非内置命令的名称,比如time_to_minutes:
time_to_minutes (){ local hour="$1" local minute="$2" hour=${hour#0} # 去除小时前的前导0,比如把"08"转为"8" minute=${minute#0} echo $((hour * 60 + minute)) }
- 修正变量赋值语法
start函数里的$hour=${hour/:/ }是错误写法,变量赋值时不能在变量名前加$,应改为:
hour=${hour/:/ }
- 修正日期格式错误
H_now=date +%H:M``里的分钟格式符写错了,正确格式应为%M,同时建议用$(...)代替反引号(可读性更强):
H_now=$(date +%H:%M)
- 简化循环逻辑
原脚本的while循环里重复判断时间条件,容易导致逻辑冗余,可简化为只在循环内更新当前时间并判断。
修复后的完整脚本
#!/bin/bash time_to_minutes (){ local hour="$1" local minute="$2" hour=${hour#0} minute=${minute#0} echo $((hour * 60 + minute)) } start (){ # 获取当前时间并转为分钟数 H_now=$(date +%H:%M) H_now=${H_now/:/ } sum_now=$(time_to_minutes $H_now) # 读取用户输入的定时时间 read -p "Enter hour and minute the time, you want to start download:(hint: hour:minute)" target_time target_time=${target_time/:/ } sum_target=$(time_to_minutes $target_time) # 循环等待直到到达目标时间 while [ "$sum_now" -ne "$sum_target" ]; do sleep 2 # 更新当前时间的分钟数 H_now=$(date +%H:%M) H_now=${H_now/:/ } sum_now=$(time_to_minutes $H_now) done # 到达时间后执行下载 echo "********************" echo "Download Started" echo "********************" wget "https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz" } # 调用start函数启动脚本 start
额外说明
- 用
-ne(数值不等于)代替!=来比较分钟数,更符合Bash的数值比较规范 - 将用户输入变量名改为
target_time,避免和函数内的hour变量混淆,提升代码可读性 - 添加了
start函数的调用语句,原脚本未触发函数执行
内容的提问来源于stack exchange,提问作者Sadegh_Ghaffarian
相关产品推荐
相关产品推荐

