Bash оператор двоеточия в переменной подстановке?
Я унаследовал некоторый код bash, и эти две строки меня озадачивают:
branch_name=`git describe --contains --all HEAD`
branch_name=${branch_name:-HEAD}
Мое понимание оператора тэга :
заключается в том, что создается подстрока, основанная на индексе, поэтому использование строки -HEAD
в этом случае не имеет никакого смысла.
Ответы
Ответ 1
Это принимает переменную branch_name
, если она определена. Если он не определен, используйте HEAD
.
Подробнее см. Расширение параметров оболочки.
Подложки покрыты несколькими строками ниже. Разница между ними равна
${parameter:-word}
vs
${parameter:offset}
${parameter:offset:length}
Ответ 2
В этом случае двоеточие является просто модификатором для оператора -
. ${branch-HEAD}
будет расширяться до "HEAD" только в том случае, если branch
не установлен, а ${branch:-HEAD}
расширяется до "HEAD", если branch
также является пустой строкой.
$ branch=master
$ echo "${branch-HEAD} + ${branch:-HEAD}"
master + master
$ branch=""
$ echo "${branch-HEAD} + ${branch:-HEAD}"
+ HEAD
$ unset branch
$ echo "${branch-HEAD} + ${branch:-HEAD}"
HEAD + HEAD
Ответ 3
В bash, ${VAR1:-VAR2}
эквивалентно SQL coalesce(VAR1, VAR2)
или С# VAR1 ?? VAR2
.
В вашем случае:
branch_name=`git describe --contains --all HEAD`
branch_name=${branch_name:-HEAD}
Первая строка выполняет команду git
и устанавливает значение в переменной branch_name
, а затем вторая строка объединяет ее значение, присваивая значение HEAD
, если branch_name
имеет значение null.
Как вы сказали, ${VAR1:NUM}
- операция префикса строки (left
в SQL), которая при использовании с отрицательным числом, как ${VAR1: -NUMBER}
становится суффиксом (right
). Обратите внимание на пробелы перед знаком минус: если вы пропустите это пробел, он станет операцией coalesce
, как я уже говорил ранее.