在下面的代码块中,如何评估第3行和第4行?
for f in "${CT_LIB_DIR}/scripts/build/debug/"*.sh; do
_f="$(basename "${f}" .sh)"
_f="${_f#???-}"
__f="CT_DEBUG_${_f^^}"
done
答案 0 :(得分:2)
${PARAMETER#PATTERN}
子字符串删除
这种形式是从字符串的开头删除试图匹配的描述模式。运算符“#”将尝试删除与模式匹配的最短文本,而运算符“ ##”将尝试与最长的文本匹配。
STRING="Hello world"
echo "${STRING#??????}"
>> world
${PARAMETER^}
${PARAMETER^^}
${PARAMETER,}
${PARAMETER,,}
这些扩展运算符会修改扩展文本中字母的大小写。
^
运算符将第一个字符修改为大写,,
运算符将修改为小写。使用双精度格式(^^
和,,
)时,将转换所有字符。
示例:
var="somewords"
echo ${var^^}
>> SOMEWORDS
答案 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-