You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:16:16