Переменное расширение в фигурных скобках

Это код

a=''
b=john
c=${a-$b}
echo $c

И выход пустой строки

И для аналогичного кода, где первая переменная не инициализируется

b1=doe
c1=${a1-$b1}
echo $c1

И вывод

doe

Я не понимаю, как bash имеет дело с расширением переменных, приводящих к разным результатам.

Ответы

Ответ 1

Существует два варианта обозначения ${var-value}, один без двоеточия, как показано, и один с двоеточием: ${var:-value}.

Первая версия без двоеточия означает "если $var установлено любое значение (включая пустую строку), используйте его; в противном случае используйте value вместо этого.

Вторая версия с двоеточием означает "если $var установлено любое значение, кроме пустой строки, используйте его; в противном случае используйте value вместо этого.

Этот шаблон сохраняется и для других подстановок переменных, в частности:

  • ${var:=value}
    • Если $var установлено на любую непустую строку, оставьте ее неизменной; в противном случае установите $var в value.
  • ${var=value}
    • Если $var установлено любое значение (включая пустую строку), оставьте его неизменным; в противном случае установите $var в value.
  • ${var:?message}
    • если $var задано любая непустая строка, ничего не делать; в противном случае, жалуйтесь на использование данного сообщения '(где предоставляется сообщение по умолчанию, если message само пусто).
  • ${var?message}
    • Если $var установлено любое значение (включая пустую строку), ничего не делать; в противном случае, жалуйтесь на использование данного сообщения '.

Все эти обозначения относятся к любой совместимой с POSIX оболочке (Bourne, Korn, Bash и другие). Вы можете найти руководство для версии bash онлайн - в разделе Расширение параметров оболочки. Bash также имеет ряд нестандартных обозначений, многие из которых чрезвычайно полезны, но не обязательно разделяются с другими оболочками.