使用Shell操作符-ne和!=比较时间时结果异常,求原因解析
WSL与Windows时间同步检测脚本问题分析
我编写了如下Bash脚本,用于检测WSL和Windows系统时间是否同步:
#!/bin/bash WinTime=$(powershell.exe "& {get-date -UFormat '%Y/%m/%d %H:%M:%S'}") WSLTime=$(date +"%Y/%m/%d %H:%M:%S") echo "$WinTime" echo "$WSLTime" if [ "$WinTime" != "$WSLTime" ]; then echo "🪟 Windows: $WinTime" echo "🐧 WSL: $WSLTime" echo "NotSynced" else echo "Synced" fi
遇到的问题:
- 使用
-ne操作符时,脚本输出“Synced”但伴随警告信息“integer expression expected” - 使用
!=操作符时,输出“NotSynced”
问题原因拆解
1. -ne和!=的用法差异
在Bash的[ ]条件判断里:
-ne是整数比较运算符,只能用来对比整数。你这里的时间是字符串格式,用-ne时Bash会强行把字符串转成整数,转换失败就抛出警告,同时错误地判定两者“相等”,所以输出“Synced”。!=是字符串比较运算符,直接按字符内容对比,这才是匹配你场景的正确用法。
2. 时间字符串的隐性差异
PowerShell和Ubuntu输出的时间字符串看似一致,但实际可能存在不可见的空白字符差异:
- PowerShell的
get-date输出可能带有Windows风格的回车符(\r),而Ubuntu的date输出是Unix风格的换行符(\n) - 也有可能某一方输出末尾带有多余空格
这些隐形字符会导致字符串对比结果为不相等,所以!=会输出“NotSynced”。
修复后的脚本
对获取到的时间字符串做空白字符清理,去掉回车、换行和多余空格:
#!/bin/bash WinTime=$(powershell.exe "& {get-date -UFormat '%Y/%m/%d %H:%M:%S'}" | tr -d '\r\n ') WSLTime=$(date +"%Y/%m/%d %H:%M:%S" | tr -d '\r\n ') echo "$WinTime" echo "$WSLTime" if [ "$WinTime" != "$WSLTime" ]; then echo "🪟 Windows: $WinTime" echo "🐧 WSL: $WSLTime" echo "NotSynced" else echo "Synced" fi
内容的提问来源于stack exchange,提问作者Ali Abdi
相关产品推荐
相关产品推荐

