Ответ 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 для (( ))
является $(( ))
. Обратите внимание, что в поведении есть некоторые тонкие различия.
Следующие ссылки подробно объясняют эти темы:
- http://mywiki.wooledge.org/BashFAQ/031 (разница между
test
,[
и[[
) - http://mywiki.wooledge.org/ArithmeticExpression (
let
,(( ))
и$(( ))
) - http://www.ibm.com/developerworks/library/l-bash-test/index.html (все выше)
См. также:
Бонус: некоторые разработчики debian однажды утверждали, должны ли они использовать систему test
или оболочку builtin test
из-за некоторых различий в реализации встроенного test
. Если вас интересуют подробности различий системы test
и оболочки, встроенной test
, вы можете прочитать дискуссию разработчиков debian здесь: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=267142.