Интересно, существует ли различие между
if [ $x -eq $y -o $x -eq 1 ]
if [ $x -eq $y ] || [ $x -eq 1 ]
Оба, кажется, работают.Спасибо
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
Вы не можете использовать &&
проверять, существует ли файл; можно только знать, работает ли команда, из которой налево выходят успешно или с отказом, и, или не прибежать второй команда соответственно. Единственная разница, которую я вижу, была бы то, что первая из Вашей команды будет работать единственным процессом ([
, иначе test
)., в то время как второй может произвести два процесса если первые ненулевые возвраты команды.
Никакое принципиальное различие иначе.