Подтвердить что ты не робот

Когда вы используете (()) или/usr/bin/test

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

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

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

4b9b3361

Ответ 1

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

  • вы хотите использовать /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 или оболочку builtin test из-за некоторых различий в реализации встроенного test. Если вас интересуют подробности различий системы test и оболочки, встроенной test, вы можете прочитать дискуссию разработчиков debian здесь: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=267142.

Ответ 2

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

Ответ 3

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

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

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

вместо

((x = y * z))

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