Когда вы используете (()) или / usr / bin / test - PullRequest
17 голосов
/ 30 июня 2011

Я видел сценарии, использующие команду test и [ ] или [[ ]].Но когда нам нужно использовать /usr/bin/test и (( ))?

Есть ли случаи, когда нам нужно пойти на последнее?

С уважением, Джон

Ответы [ 3 ]

19 голосов
/ 30 июня 2011

Чтобы ответить на ваш вопрос:

  • вы хотите использовать /usr/bin/test, когда хотите test что-то, но не в оболочке (например, find ... -exec test ...)
  • вы хотите использовать (( )), когда вы решаете арифметическое выражение, и вы используете bash, потому что (( )) зависит от bash.

Теперь немного фона:

Команда /usr/bin/test требуется по стандарту POSIX . POSIX также требует, чтобы [ был определен как псевдоним для test. Единственная разница между test и [ состоит в том, что [ требует, чтобы конечный параметр был ].

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

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

(( )) и [[ ]] были введены bash (и, возможно, некоторыми другими оболочками) как синтаксический сахар . (( )) оценивает арифметические выражения, тогда как [[ ]] оценивает логические выражения. Оба позволяют вам писать выражения в «более естественном синтаксисе».

Решение об использовании [[ или [ зависит от того, хотите ли вы использовать «более естественный синтаксис», и, поскольку sh не поддерживает [[, хотите ли вы зависеть от bash.

Решение об использовании (( )) зависит от того, нужны ли вам арифметические выражения, и опять же, поскольку sh не поддерживает (( )), хотите ли вы зависеть от bash. POSIX альтернативой (( )) является $(( )). Обратите внимание, что в поведении есть некоторые тонкие различия.

Следующие ссылки объясняют эти темы очень подробно:

Смотри также:

Бонус: Некоторые разработчики Debian однажды спорили, следует ли им использовать систему test или встроенную оболочку test, из-за некоторых отличий в реализации встроенной test. Если вас интересуют подробности различий системы test и встроенной оболочки test, тогда вы можете прочитать обсуждение разработчиков Debian здесь: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=267142.

6 голосов
/ 30 июня 2011

(( )) вычисляет арифметическое выражение в bash (см. man bash).
[[ ]] вычисляет логическое выражение в bash (см. man bash).
[ ] - этотак же, как test, используется для проверки типов файлов и сравнения значений (см. man test).

3 голосов
/ 30 июня 2011

Вы используете /usr/bin/test, когда хотите, чтобы дела шли медленнее. Современные оболочки (большинство оболочек, выпущенных примерно с 1990 года, возможно, ранее), имеют test и его синоним [ в качестве встроенных команд. Формальный вызов /usr/bin/test был бы актом отчуждения, потому что у оболочки есть неработающая тестовая команда, и автономная система в порядке - но было бы лучше получить исправленную оболочку.

Вы используете (( ... )) для выполнения арифметики. Старомодной альтернативой была команда expr. Это было сложно использовать, потому что требовалось много экранирования - это был / был отдельный исполняемый файл, и вы должны были получить множество метасимволов оболочки после оболочки до expr. Следовательно:

x=$(expr $y '*' $z)

вместо

((x = y * z))

Вам даже не нужно украшать переменные с помощью $ в (( ... )).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...