Я видел скрипты с помощью команды test и [ ] или [[ ]]. Но когда нам нужно использовать /usr/bin/test и (( ))?
Есть ли какие-то случаи, когда нам нужно идти за последним?
С уважением, Джон
Я видел скрипты с помощью команды test и [ ] или [[ ]]. Но когда нам нужно использовать /usr/bin/test и (( ))?
Есть ли какие-то случаи, когда нам нужно идти за последним?
С уважением, Джон
Чтобы ответить на ваш вопрос:
/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 для (( )) является $(( )). Обратите внимание, что в поведении есть некоторые тонкие различия.
Следующие ссылки подробно объясняют эти темы:
test, [ и [[)let, (( )) и $(( )))См. также:
Бонус: некоторые разработчики debian однажды утверждали, должны ли они использовать систему test или оболочку builtin test из-за некоторых различий в реализации встроенного test. Если вас интересуют подробности различий системы test и оболочки, встроенной test, вы можете прочитать дискуссию разработчиков debian здесь: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=267142.
(( )) оценивает арифметическое выражение в bash (см. man bash). [[ ]] оценивает логическое выражение в bash (см. man bash). [ ] совпадает с test, используется для проверки типов файлов и сравнения значений (см. man test).
Вы используете /usr/bin/test, когда вы хотите, чтобы все происходило медленнее. Современные оболочки (большинство оболочек, выпущенных с 1990 года, возможно, раньше) имеют test и его синоним [ как встроенные команды. Формально вызов /usr/bin/test был бы актом desparation, потому что оболочка имеет сломанную тестовую команду, а автономная система - ОК - но было бы лучше получить фиксированную оболочку.
Вы используете (( ... )) для выполнения арифметики. Старомодная альтернатива была командой expr. Это было сложно использовать, потому что для этого требовалось много побегов - это/был отдельный исполняемый файл, и вам нужно было получить много метасимволов оболочки за оболочкой до expr. Следовательно:
x=$(expr $y '*' $z)
вместо
((x = y * z))
Вам даже не нужно украшать переменные $ в (( ... )).