使用双插入符^^进行参数扩展

时间:2019-07-11 23:24:28

标签: regex bash parameter-expansion

在下面的代码块中,如何评估第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 个答案:

答案 0 :(得分:2)

${PARAMETER#PATTERN}

子字符串删除

这种形式是从字符串的开头删除试图匹配的描述模式。运算符“#”将尝试删除与模式匹配的最短文本,而运算符“ ##”将尝试与最长的文本匹配。

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

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

这些扩展运算符会修改扩展文本中字母的大小写。

^运算符将第一个字符修改为大写,,运算符将修改为小写。使用双精度格式(^^,,)时,将转换所有字符。

示例:

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

请参见more information on bash parameter expansion

答案 1 :(得分:1)

第2、3、4行用于构造变量名

if cmd[-4:] != '.exe':
    cmd = cmd + '.exe'

第2行中的路径已删除,结尾处的.sh也已删除。
在第3行中,当第四个字符为shutil时,删除前四个字符。
在第4行中,它将附加到字符串并转换为大写。
让我们看看a / b / c.sh和ddd-eee.sh

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

第2、3、4步可以替换为1行:

-

编辑:首先,我有 a/b/c.sh ddd-eee.sh (2) c ddd-eee (3) c eee (4) CT_DEBUG_C CT_DEBUG_EEE ,但由于__f=$(sed -r 's#(.*/)*(...-)?(.*).sh#CT_DEBUG_\U\3#' <<< "$f") 而失败:(...-)*也将被删除!

在这种情况下,您没有变量aaa-bbb-c.sh稍后在代码中使用,因此您可能需要两行:

bbb-