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