Я пытаюсь понять грамматику/синтаксис командного языка оболочки (чтобы иметь возможность его анализировать), но не могу найти, где определен синтаксис операций сравнения.
В качестве примера:
x=10
while [ $x -gt 0 ]
do
#do something
x=$(($x-1))
done
Синтаксис [ $x -gt 0 ]
, похоже, не определен нигде в спецификации, указанной выше. Фактически, синтаксис [...]
не встречается в правилах грамматики, а ]
отсутствует в токенах пунктуации/оператора. В спецификации мало что сказано об этой конструкции, кроме использования []
для скобок регулярных выражений и того, что [
, но не ]
, «может» необходимо заключать в кавычки в строках.
Мои вопросы:
[...]
(будь то в POSIX или где-либо еще)?Это часть стандарта POSIX. «Если переменная оболочки x содержит значение, которое образует допустимую целочисленную константу, необязательно включая ведущий <знак плюс> или <дефис-минус>, то арифметические расширения «$((x))» и «$(($ x))" должен возвращать то же значение." Я регулярно использую его в bash. Он работает даже в базовых оболочках, таких как busybox.
Хорошо, теперь я вижу. Спасибо!
Являются ли операторы сравнения частью спецификации POSIX или общепризнанным расширением?
В языке оболочки POSIX нет специального синтаксиса для сравнения. [
— имя стандартной команды утилиты, $x -gt 0 ]
— ее аргументы, закрывающая квадратная скобка здесь только для эстетики. Команду [ $x -gt 0 ]
также можно записать как test $x -gt 0
.
Где я могу найти синтаксис операторов сравнения оболочки или вообще
[...]
?
Кстати, вы можете написать
x
вместо$x
внутри блока арифметического расширения.