Подтвердить что ты не робот

Bash оператор двоеточия в переменной подстановке?

Я унаследовал некоторый код bash, и эти две строки меня озадачивают:

branch_name=`git describe --contains --all HEAD`
branch_name=${branch_name:-HEAD}

Мое понимание оператора тэга : заключается в том, что создается подстрока, основанная на индексе, поэтому использование строки -HEAD в этом случае не имеет никакого смысла.

4b9b3361

Ответ 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, как я уже говорил ранее.