Что является различием между двумя подходами оценки условия в ударе

Интересно, существует ли различие между

if [ $x -eq $y -o $x -eq 1 ]
if [ $x -eq $y ] || [ $x -eq 1 ]

Оба, кажется, работают.Спасибо

5
задан 13 November 2016 в 15:09

2 ответа

TL; DR: они не то же, и цель немного отличается, хотя они стремятся к тому же желаемому эффекту.

Различие находится в том, кто делает логические проверки. Как можно знать, квадратные скобки синонимичны с test команда. Так, с -o Вы видите единственную тестовую команду, и эти два условия оценены вместе, затем возвращенный статус выхода для избиения.

С && Вы имеете два test операторы, каждый возврат отдельно, но затем колотят, оценивает, если они оба верны. Последний рекомендуется в наше время с тех пор test немного датирован и имеет проблемы (и новая версия теста [[ часто рекомендуется, посмотрите это), плюс он намного более читаемо начиная с && или || используются на многих других языках включая C и Java.

Таким образом в первом случае, с [ Вы оцениваете два выражения, с && Вы оцениваете статусы выхода два [ команды.

Дополнительная информация:

Как указано @steeldriver в комментариях, существует действительно встроенная команда test, который является внутренней реализацией удара /usr/bin/test. Независимо от этого факта, встроенный путь test и /usr/bin/test работа синтаксически является точно тем же.

Следует иметь в виду, однако, это при использовании некоторой другой оболочки, чем bash или оболочка Ubuntu по умолчанию dash, затем Вы будете, вероятно, использовать /usr/bin/test . Оболочка Korn, ksh например, не имеет test встроенный.

Следует иметь в виду также факт это && и test не эквивалентны:

  • test как предполагается, оценивает операторы и статус выхода возврата как любая другая команда (см. спецификации POSIX для теста). Это имеет целый список вещей, которые можно оценить - существование файлов, типов файлов, целочисленного и сравнения строк.
  • Логические операторы такой как && и || используются оболочками для оценки статусов выхода отдельных команд точно так же, как ; делает, который является одной из причин в странице справочника удара, под которой находятся эти операторы Lists раздел. Кроме того, они не могут быть автономной командой, как test - они - стандартные операторы списка оболочки. Так, в отличие от этого test Вы не можете использовать && проверять, существует ли файл; можно только знать, работает ли команда, из которой налево выходят успешно или с отказом, и, или не прибежать второй команда соответственно.
10
ответ дан 23 November 2019 в 08:48

Единственная разница, которую я вижу, была бы то, что первая из Вашей команды будет работать единственным процессом ([, иначе test)., в то время как второй может произвести два процесса если первые ненулевые возвраты команды.

Никакое принципиальное различие иначе.

1
ответ дан 23 November 2019 в 08:48

Другие вопросы по тегам:

Похожие вопросы: