Я видел скрипты с помощью команды 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))
Вам даже не нужно украшать переменные $
в (( ... ))
.