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

17

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

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

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

    
задан John 30.06.2011 в 14:40
источник

3 ответа

19

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

  • вы хотите использовать /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 здесь: Ссылка .

    
ответ дан lesmana 30.06.2011 в 15:10
источник
  • Стоит отметить, что zsh и ksh также поддерживают [[]] и (()) (по крайней мере, версии, которые я просто пытался сделать). –  Keith Thompson 06.06.2014 в 23:15
6

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

    
ответ дан bmk 30.06.2011 в 15:06
источник
3

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

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

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

вместо

((x = y * z))

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

    
ответ дан Jonathan Leffler 30.06.2011 в 16:24
источник
  • , например. Я просто добавил / usr / bin / test в Makefile, потому что Makefile не определяет SHELL, а некоторые пользователи имеют SHELL = bash и другие SHELL = csh. Поэтому я не могу полагаться на один из лучших тестов, (()) или [[]], будучи доступным. // Конечно, вы можете утверждать, что использование Make на всех является ошибкой. Или, по крайней мере, не определить SHELL в make. –  Krazy Glew 13.01.2013 в 23:39