Shell脚本分组条件时缺失']'错误及日期时间逻辑实现问题
问题分析与解决方案
你遇到的「缺失']'」错误,主要是因为bash条件判断的语法不符合规范,再加上数字比较误用了字符串运算符,不仅会触发语法报错,还可能隐藏逻辑隐患。下面一步步帮你修正:
错误原因拆解
[ ]中不能直接用&&:POSIX标准的test命令(也就是[ ])里,多条件逻辑与要用-a;如果想用更直观的&&,得改用bash扩展的[[ ]]语法。- 数字比较不能用
</>:这两个是字符串比较运算符,比如"10"<"9"会被判定为true(因为ASCII码中"1"比"9"小),正确的数字比较应该用-lt(小于)、-gt(大于)。 [ ]前后必须留空格:闭合的]前面必须加空格,否则shell会把它当成字符串的一部分,直接触发「缺失']'」的语法错误。
修正后的完整代码
#!/bin/bash CURR_DAY=$(date '+%A') NOW=$(date '+%H') CURR_HOUR="09" # 先判断是否是周五 if [[ "$CURR_DAY" == "Friday" ]]; then if [[ "$NOW" -lt 15 ]]; then # 周五且下午3点前,保留当前完整时间 CURR_TIME=$(date '+%Y%m%d%H%M%S') else # 周五且下午3点后,用当天日期+09点的时分秒 CURR_TIME=$(date '+%Y%m%d')${CURR_HOUR}$(date '+%M%S') fi else # 非周五,自动计算下周五的日期,默认用09点的时间 NEXT_FRIDAY=$(date -d "next Friday" '+%Y%m%d') CURR_TIME="${NEXT_FRIDAY}${CURR_HOUR}$(date '+%M%S')" fi echo "最终生成时间:$CURR_TIME"
代码细节说明
- 用
[[ ]]替代[ ]:支持更直观的逻辑运算符(&&/||)和字符串匹配,语法容错性更高 - 数字比较用
-lt:确保小时的比较是数值层面的,彻底避免字符串比较的bug - 下周五的计算:
date -d "next Friday"是bash中获取下周五最简洁的方式,会自动处理当前是周六/周日的情况(比如周日执行时,next Friday就是5天后) - 时间拼接:把日期、固定小时、当前时分秒拼接成统一格式的时间字符串,符合你的需求
额外优化建议
如果不需要保留当前的分秒,可以把时分秒固定为0000,改成CURR_TIME="${NEXT_FRIDAY}${CURR_HOUR}0000",格式会更统一;另外开头的#!/bin/bash一定要加上,避免在不同shell环境下出现兼容性问题。
内容的提问来源于stack exchange,提问作者Tanvir
相关产品推荐
相关产品推荐

