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

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

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

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


person Gardner Bickford    schedule 28.02.2013    source источник


Ответы (3)


Это принимает переменную branch_name, если она определена. Если он не определен, используйте вместо него HEAD.

Дополнительные сведения см. в разделе Расширение параметров оболочки:

3.5.3 Расширение параметров оболочки

Символ «$» вводит расширение параметра, подстановку команд или арифметическое расширение. ... Базовая форма расширения параметра — ${parameter}.
...
Если расширение подстроки не выполняется, используется форма, описанная ниже (например, ':-'), Bash проверяет параметр, который не установлен или равен нулю. Отсутствие двоеточия приводит к тесту только для параметра, который не установлен. Иными словами, если двоеточие включено, оператор проверяет как наличие параметра, так и то, что его значение не равно нулю; если двоеточие опущено, оператор проверяет только существование.

${параметр:-word}

Если параметр не установлен или равен нулю, расширение word заменяется. В противном случае подставляется значение parameter.


Подстроки рассматриваются несколькими строками ниже. Разница между ними

${parameter:-word}

vs

${parameter:offset}
${parameter:offset:length}

${параметр:смещение
${параметр:смещение:длина

Это называется расширением подстроки. Оно расширяется до длины символов значения параметра, начиная с символа, указанного смещением.
...
Если смещение оценивается как число меньше нуля, значение используется как смещение в символах от конец значения параметра. ... Обратите внимание, что отрицательное смещение должно быть отделено от двоеточия хотя бы одним пробелом, чтобы его нельзя было спутать с расширением ‘:-’.

person Olaf Dietsche    schedule 28.02.2013
comment
А что, если есть только ':-'? НРАВИТСЯ ${RDAUTH:-} - person willemdh; 12.08.2016
comment
Это работает как пустая строка, tt дает либо содержимое RDAUTH, либо пустую строку. - person Olaf Dietsche; 12.08.2016

В этом случае двоеточие — это просто модификатор оператора -. ${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
person chepner    schedule 28.02.2013

В bash ${VAR1:-VAR2} эквивалентно coalesce(VAR1, VAR2) в SQL или VAR1 ?? VAR2 в C#.

В твоем случае:

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

Первая строка выполняет команду git и устанавливает значение в переменной branch_name, затем вторая строка объединяет свое значение, присваивая значение HEAD, если branch_name равно нулю.

Как вы сказали, ${VAR1:NUM} - это операция префикса строки (left в SQL), которая при использовании с отрицательным числом, поскольку ${VAR1: -NUMBER} становится операцией суффикса (right). Обратите внимание на пробел перед знаком минус: если вы пропустите этот пробел, он станет операцией coalesce, как я уже говорил ранее.

person ruizpauker    schedule 28.02.2013