使用shell运算符-ne和!= [duplicate]时得到不同的结果

jei2mxaa  于 2023-02-09  发布在  Shell
关注(0)|答案(1)|浏览(181)
    • 此问题在此处已有答案**:

Shell equality operators (=, ==, -eq)(4个答案)
昨天关门了。
我编写了下面的shell脚本,当使用-ne时,它会给出结果Synced,但也会给出警告消息: integer expression expected
当我使用!=时,它给出不同步...
PowerShell的日期时间和Ubuntu的日期时间不同吗?(我在比较整数和字符串吗?)

#!/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
5f0d552i

5f0d552i1#

这个问题最初的问题是-ne!=之间的区别;评论中谈到了这一点。
一旦OP切换到使用!=,这使得第二个问题浮到顶部......当两个字符串看起来相同时,!=评估为“真”。
这个答案解决了第二个问题......
我在cygwin环境中运行bash(即,在windows下,所以我可以访问powershell.exe)。
运行OP的代码,我也得到了相同的结果:

Windows: 2023/02/07 09:32:47
WSL:     2023/02/07 09:32:47
NotSynced

如果我们看一下这两个变量的实际内容,我们会看到:

$ echo "$WinTime" | od -c
0000000   2   0   2   3   /   0   2   /   0   7       0   9   :   3   2
0000020   :   4   7  \r  \n
0000025

$ echo "$WSLTime" | od -c
0000000   2   0   2   3   /   0   2   /   0   7       0   9   :   3   2
0000020   :   4   7  \n
0000024

请注意,$WinTime包含一个尾随的\r(windows/dos行尾),这是运行Windows二进制文件powershell.exe的结果。这个额外的\r导致条件计算为“true”,因此打印NotSynced
OP将希望删除尾随的\r
我对powershell了解不够,不知道它是否有禁用\r的选项,所以我让tr删除\r

WinTime=$(powershell.exe "& {get-date -UFormat '%Y/%m/%d %H:%M:%S'}" | tr -d '\r')

我们可以看到\r已不存在:

$ echo "$WinTime" | od -c
0000000   2   0   2   3   /   0   2   /   0   7       0   9   :   3   6
0000020   :   2   2  \n
0000024

现在条件求值为“false”并打印Synced

**注意:**在两个时间捕获命令恰好在更改之前/之后运行(以秒为单位)的情况下,脚本仍可能报告NotSynced

相关问题