Сценарий оболочки: простое сравнение в скобках не работает так, как я ожидаю? - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь написать скрипт, который возвращает размер диска в байтах. Все идет нормально. Затем я хочу отобразить его как можно более удобным для чтения из единиц, не пытаясь отобразить небольшой размер в миллионных долях ТБ или значение в террабайтах в байтах. Поэтому, если число байтов превышает 1024, попробуйте КБ, если это число превышает 1024, попробуйте МБ и т. Д. c. В целях иллюстрации мое действительное значение равно 10632563023872.

Каждый говорит, что, по возможности, используйте двойные скобки. Большая часть моего сценария написана в двойных скобках. Но в этом случае математика просто не работает так, как я ожидаю, поэтому, возможно, кто-то может помочь мне понять, чего мне не хватает. Весь сценарий имеет гораздо больше, но мне удалось выделить мою проблему в одну строку:

num=10632563023872; 
if [[ $num -lt 1024 ]]; 
then echo "$num is less than 1024"; 
else echo "$num is greater than 1024"; 
fi

Вывод:

10632563023872 is less than 1024

Хотя shellcheck говорит, что синтаксис в порядке математика явно (?) неверна, если только я не пропущу какую-то проблему с типом данных, но в bash нет объявления переменных и типов данных. Если я попытаюсь сделать это с помощью скобок, я получу правильный ответ, хотя есть ошибка, которая, как я подтвердил, означает, что она просто возвращает false, потому что мне не нравится мой ввод:

num=10632563023872; 
if (( $num -lt 1024 )); 
then echo "$num is less than 1024"; 
else echo "$num is greater than 1024"; 
fi
-sh: 10632563023872: not found
10632563023872 is greater than 1024

1 Ответ

0 голосов
/ 20 марта 2020

Q: Почему код в квадратных скобках не работает так, как я ожидаю?

A: Поскольку оказывается, что среда ESXi CLI не является bash, хотя синтаксис, который я использовал, обычно bash. Задавая этот вопрос, я узнал, что это не bash, поэтому любые отличия от bash являются всего лишь артефактами того, что это не является истинной bash средой.

Q: Какой синтаксис выполнил бы sh задачу лучше, чем [[ $num -lt 1024 ]] в моей ситуации?

A: [[ $num \> 1024 ]], кажется, работает надежно. Тем не менее, «если в оболочке, где [[действует как [, [[$ num> 1024]] выполняет сравнение строк вместо сравнения числовых c. Если это решает вашу проблему, это означает, что $ num isn ' на самом деле это действительное число - может быть, оно читается из файла или другого источника, в котором вместо новой строки UNIX есть новые строки DOS, просто чтобы исключить случайную потенциальную причину? "

Я изначально пометил вопрос как bash, но когда стало очевидно, что ESXi не использует строго распознаваемую версию оболочки bash, я изменил тег на ESXi. Я надеюсь, что для будущих читателей это поможет объяснить, почему некоторый код может работать не так, как предполагалось, при написании скриптов ESXi.

Спасибо людям, которые указали направление в комментариях.

...