Получение разных результатов при использовании операторов оболочки -ne и !=

Я написал приведенный ниже сценарий оболочки, при использовании -ne он дает результат Synced, но также с предупреждающим сообщением : integer expression expected.
Когда я использую !=, это дает NotSynced...
Дата и время 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:

🤔 А знаете ли вы, что...
Bash поддерживает механизмы перенаправления ввода и вывода для команд и скриптов.


63
1

Ответ:

Решено

Первоначальная проблема вопроса заключалась в разнице между -ne и !=; это было рассмотрено в комментариях.

Как только OP переключился на использование !=, это позволило второй проблеме всплыть наверх ... != оценивалось как «истина», когда две строки казались одинаковыми.

Этот ответ касается второй проблемы...


Я запускаю bash в среде cygwin (т. е. под 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 приводит к тому, что условное выражение оценивается как «истина» и, таким образом, печатается NotSynced.

ОП захочет удалить трейлинг \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

И теперь условное выражение оценивается как «ложь» и печатает Synced.

ПРИМЕЧАНИЕ. Сценарий может по-прежнему сообщать NotSynced в сценарии, в котором две команды захвата времени выполняются непосредственно до/после изменения секунд.