Расширение параметра с двойной кареткой ^^ - PullRequest
1 голос
/ 12 июля 2019

Как оцениваются строки № 3 и 4 в следующем блоке кода?

for f in "${CT_LIB_DIR}/scripts/build/debug/"*.sh; do
    _f="$(basename "${f}" .sh)"
    _f="${_f#???-}"
    __f="CT_DEBUG_${_f^^}"
done

Ответы [ 2 ]

2 голосов
/ 12 июля 2019
${PARAMETER#PATTERN}

Удаление подстроки

Эта форма предназначена для удаления описанного шаблона, пытаясь сопоставить его с началом строки.Оператор "#" попытается удалить самый короткий текст, соответствующий шаблону, а "##" попытается сделать это с самым длинным текстом.

STRING="Hello world"
echo "${STRING#??????}"
>> world

${PARAMETER^}
${PARAMETER^^}
${PARAMETER,}
${PARAMETER,,}

Эти операторы раскрытия изменяют регистр букв в развернутом тексте.

Оператор ^ изменяет первый символ в верхний регистр, , оператор в нижнем регистре.При использовании двойной формы (^^ и ,,) все символы преобразуются.

Пример:

var="somewords"
echo ${var^^}
>> SOMEWORDS

См. дополнительную информацию о расширении параметров bash

1 голос
/ 12 июля 2019

Строки 2,3,4 предназначены для построения имени переменной

(2)    _f="$(basename "${f}" .sh)"
(3)    _f="${_f#???-}"
(4)    __f="CT_DEBUG_${_f^^}"

В строке 2 путь удален, а также .sh в конце.
В строке 3 первые 4символы удаляются, когда четвертый символ представляет собой -.
. В строке 4 он добавляется к строке и преобразуется в верхний регистр.
Давайте посмотрим, что происходит с a / b / c.sh и ddd-eee.sh

       a/b/c.sh       ddd-eee.sh
(2)    c              ddd-eee
(3)    c              eee
(4)    CT_DEBUG_C     CT_DEBUG_EEE

Шаги 2,3,4 можно заменить на 1 строку:

__f=$(sed -r 's#(.*/)*(...-)?(.*).sh#CT_DEBUG_\U\3#' <<< "$f")

РЕДАКТИРОВАТЬ: Сначала у меня было (...-)*, что не удалось бы с aaa-bbb-c.sh: bbb- тоже будет удален!

В этом случае у вас нет переменной _f, которая используется позже в коде, поэтому вы можете захотеть 2 строки:

_f=$(sed -r 's#(.*/)*(...-)?(.*).sh#\3#' <<< "$f")
__f="CT_DEBUG_${_f^^}"
...