в чем разница между if и [[ в bash?

в чем разница между if и [[ в bash?

я вижу это

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, они могут вообще не существовать).

Связанный контент