Bash跳过执行的脚本代码生成21:00空文件的问题如何解决
问题原因
你的脚本首行声明为#!/bin/sh,属于POSIX标准shell环境,不支持Bash专属的[[ ]]扩展语法。此时shell会把判断语句中的>、<识别为标准输出重定向符,执行时会将前面命令的输出写入到>后指定的文件名(也就是21:00),这就是对应空文件生成的核心原因。你当前脚本逻辑看起来能正常执行,大概率是实际运行时调用了Bash而非sh,但语法不规范依然会触发重定向生成文件。
修复方案
推荐优先使用数值比较的写法,规避字符串比较的语法歧义问题:
- 方案1:使用Bash专属语法,适配Bash运行环境
将首行解释器声明改为Bash,同时直接提取小时数值做比较,逻辑更清晰也不会产生语法歧义:
#!/bin/bash current_hour=$(date +%H) if [ "$current_hour" -ge 21 ] || [ "$current_hour" -lt 7 ]; then echo 'Gitlab might be down at these hours, skipping translation sync script' 1>&2 exit ${EXIT_CODE:-0} fi
注:给EXIT_CODE增加默认值0,可以避免变量未定义的报错问题。
- 方案2:保留POSIX sh兼容,适配所有shell环境
如果需要脚本兼容不同类Unix系统的默认sh环境,使用标准[ ]语法加数值比较即可:
#!/bin/sh current_hour=$(date +%H) if [ "$current_hour" -ge 21 ] || [ "$current_hour" -lt 7 ]; then echo 'Gitlab might be down at these hours, skipping translation sync script' 1>&2 exit ${EXIT_CODE:-0} fi
内容的提问来源于stack exchange,提问作者Filip
相关产品推荐
相关产品推荐

