
я вижу это
if cmd
then
echo Hi
fi
работает иначе, чем
if [[ $(cmd) ]]
then
echo Hi
fi
Так что же происходит, когда есть [[ и когда его нет?
решение1
В оболочке [
есть псевдоним для команды test. Онявляетсякоманда. Это [[
функция некоторых оболочек, которая отличается лишь немного. В bash это ключевое слово, а не команда, но функционирует как команда.
Вы можете думать об этом так: вы запускаете [[
и предоставляете вывод "$(cmd)" в качестве аргументов этой команде. if
затем проверяет возвращаемый статус [[
. Когда для не заданы операторы [[
, -n
подразумевается.
-n string
True if the length of string is non-zero.
Для ваших примеров:
if cmd # check the return status of cmd
if [[ $(cmd) ]] # check if cmd has any output
решение2
Оператор if expr
(без скобок) проверяет возвращаемый статус expr
после того, как он оценен как команда bash. В случае успеха он рассматривается как true
значение.
С другой стороны, if [[ expr ]]
с двойными квадратными скобками - это bash
-специфическийключевое словокоторый может обрабатывать свой собственный набор опций, например, -f /path/to/file
для проверки существования файла или даже для обработки переменных тестов, таких как $a == $b
. В этих скобках вы должны явно указать ему, что нужно оценить некоторое выражение как набор команд bash с if [[ $(cmds) ]]
. В противном случае он будет обрабатывать все, что там есть, как специальное выражение и будет проанализировано по-другому.
Также есть if [ expr ]
конструкция, которая обычно является псевдонимом (или, в некоторых случаях, приблизительной реализацией) if test expr
. Если test
команда имеет опцию, доступную для использования, то вы также можете использовать ее между одинарными скобками.
Для большего веселья есть if ((expr))
конструкция, которая лучше всего подходит для работы с числами, поскольку все внутри оценивается как арифметическое выражение. Это также ключевое слово, как и двойные скобки.
По сути, if expr
и if [ expr ]
являются переносимыми (т. е. все оболочки могут их обрабатывать и обрабатывать их практически одинаково), а if [[ expr ]]
и if (( expr ))
зависят от реализации, т. е. это ключевые слова, оценка которых сильно зависит от оболочки, в которой вы их используете (и если вы не используете что-то вроде bash
, zsh
, или ksh
, они могут вообще не существовать).