带双插入符的参数扩展 ^^
Parameter expansion with double caret ^^
在下面的代码块中,第 3 行和第 4 行是如何求值的?
for f in "${CT_LIB_DIR}/scripts/build/debug/"*.sh; do
_f="$(basename "${f}" .sh)"
_f="${_f#???-}"
__f="CT_DEBUG_${_f^^}"
done
${PARAMETER#PATTERN}
删除子字符串
这种形式是为了从字符串的开头删除试图匹配它的描述模式。运算符“#”将尝试删除与模式匹配的最短文本,而“##”则尝试删除与最长文本匹配的文本。
STRING="Hello world"
echo "${STRING#??????}"
>> world
${PARAMETER^}
${PARAMETER^^}
${PARAMETER,}
${PARAMETER,,}
这些扩展运算符修改扩展文本中字母的大小写。
^
运算符将第一个字符修改为大写,,
运算符将第一个字符修改为小写。当使用 double-form(^^
和 ,,
)时,所有字符都会被转换。
示例:
var="somewords"
echo ${var^^}
>> SOMEWORDS
第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#' <<< "$f")
编辑:首先我有 (...-)*
,它会因 aaa-bbb-c.sh
而失败:bbb-
也会被删除!
在这种情况下,您没有变量 _f
稍后在代码中使用的内容,因此您可能需要 2 行:
_f=$(sed -r 's#(.*/)*(...-)?(.*).sh##' <<< "$f")
__f="CT_DEBUG_${_f^^}"
在下面的代码块中,第 3 行和第 4 行是如何求值的?
for f in "${CT_LIB_DIR}/scripts/build/debug/"*.sh; do
_f="$(basename "${f}" .sh)"
_f="${_f#???-}"
__f="CT_DEBUG_${_f^^}"
done
${PARAMETER#PATTERN}
删除子字符串
这种形式是为了从字符串的开头删除试图匹配它的描述模式。运算符“#”将尝试删除与模式匹配的最短文本,而“##”则尝试删除与最长文本匹配的文本。
STRING="Hello world"
echo "${STRING#??????}"
>> world
${PARAMETER^}
${PARAMETER^^}
${PARAMETER,}
${PARAMETER,,}
这些扩展运算符修改扩展文本中字母的大小写。
^
运算符将第一个字符修改为大写,,
运算符将第一个字符修改为小写。当使用 double-form(^^
和 ,,
)时,所有字符都会被转换。
示例:
var="somewords"
echo ${var^^}
>> SOMEWORDS
第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#' <<< "$f")
编辑:首先我有 (...-)*
,它会因 aaa-bbb-c.sh
而失败:bbb-
也会被删除!
在这种情况下,您没有变量 _f
稍后在代码中使用的内容,因此您可能需要 2 行:
_f=$(sed -r 's#(.*/)*(...-)?(.*).sh##' <<< "$f")
__f="CT_DEBUG_${_f^^}"