Azure Pipeline中Bash脚本日期比较始终返回False问题排查求助
解决Azure Pipeline中Bash脚本条件判断跳错分支的问题
嘿,我看了你遇到的问题:明明预期date和swapdate相等、swapstatus也是True,结果脚本却跑到else分支里去了,result_swap被设成了false。我帮你排查了几个核心问题,应该能解决:
1. 首先是printf命令的换行坑
你写的printf那行有个多余的换行:
printf -v date '%(%Y-%m-%d)T ' -1
这个换行会让date变量末尾悄悄带上一个换行符!这样和swapdate="2022-01-19"比较时,看起来内容一样,但实际是带换行的字符串和不带换行的字符串对比,自然不相等。
把它改成单行就好,或者用更通用的date命令替代(兼容性更强,不容易出奇怪的问题):
# 替换成这个更稳妥 date=$(date +%Y-%m-%d)
2. 先验证变量的真实内容
有时候变量里会藏着空格、换行这类看不见的字符,导致比较失败。建议在条件判断前加几行打印,看看变量的真实样子:
# 用单引号把变量包起来,能看到有没有前后空格 echo "date内容: '$date'" echo "swapdate内容: '$swapdate'" # 或者打印十六进制,彻底排查隐藏字符 echo "date的十六进制: $(echo "$date" | xxd -g 1)" echo "swapdate的十六进制: $(echo "$swapdate" | xxd -g 1)"
如果date的十六进制最后有0a,那就是换行符在搞鬼,这就是问题根源。
3. 修正后的完整脚本
把上面的问题改完后,脚本应该能正常进入if分支了:
#!/bin/bash # 用更可靠的方式获取日期 date=$(date +%Y-%m-%d) echo $date swapdate="2022-01-19" swapstatus="True" # 先验证变量内容,方便排查问题 echo "date内容: '$date'" echo "swapdate内容: '$swapdate'" if [ "$date" = "$swapdate" ] && [ "$swapstatus" = "True" ]; then echo "yes!, it is equal and condition is true continue swapping" result_swap="true" echo $swapdate echo $date echo $result_swap echo $swapstatus else result_swap="false" echo "no!, it is not equal" echo $swapdate echo $date echo $result_swap echo $swapstatus fi
4. Azure Pipeline环境的额外提醒
在Azure Pipeline的Bash任务里,系统的时区或locale设置可能影响date的输出。如果你的swapdate是UTC日期,建议显式指定时区,避免时区差异导致日期不匹配:
# 强制用UTC时区获取日期 date=$(TZ=UTC date +%Y-%m-%d)
内容的提问来源于stack exchange,提问作者user5820327
相关产品推荐
相关产品推荐

