4

在下面的代码块中,如何评估第 3 行和第 4 行?

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

2 回答 2

7
${PARAMETER#PATTERN}

子串删除

这种形式是从字符串的开头删除试图匹配它的描述的模式。运算符“#”将尝试删除与模式匹配的最短文本,而“##”则尝试使用最长的文本匹配来执行此操作。

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

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

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

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

例子:

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

查看更多关于 bash 参数扩展的信息

于 2019-07-11T23:32:53.453 回答
1

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

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

在第 2 行中,路径被删除,最后的 .sh 也被删除。
在第 3 行中,当第四个字符是 a 时,前 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.shbbb-也会被删除!

在这种情况下,您没有_f稍后在代码中使用的变量,因此您可能需要 2 行:

_f=$(sed -r 's#(.*/)*(...-)?(.*).sh#\3#' <<< "$f")
__f="CT_DEBUG_${_f^^}"
于 2019-07-12T08:41:01.940 回答