我一直在阅读 GNU bash 手册指南的参数扩展部分,如果名义脚本 (IFS=';' read -sdR -p $'E[6n' ROW COL; echo ${ROW#*[};
),我似乎无法理解最终echo
命令中发生了什么。我知道命令序列试图通过将IFS
正确设置为;
来获取当前光标行,这是转义序列输出的分隔符E[6n
(切线我不完全理解为什么这需要一个预先附加的$
-sign,但也许这在手册中的某个地方)。
我没有得到的是,直接从手册中,
${参数#单词} ${参数##word} 该单词被扩展以产生模式,并根据下面描述的规则进行匹配(请参阅模式匹配)。如果模式与参数的扩展值的开头匹配,则扩展的结果是删除了最短匹配模式("#"情况)或最长匹配模式("##"情况)的参数的扩展值。如果参数为"@"或",则阵列移除操作依次应用于每个位置参数,并且扩展是结果列表。如果参数是下标有"@"或">的数组变量,则模式删除操作将依次应用于数组的每个成员,并且扩展是结果列表。
word
*[
的设置究竟在做什么。手册似乎说*
是特殊的,用于更多的字符串或数组式扩展,其中需要位置参数ROW
但不应该是字符串或数组,或者如果是,它只有 1 元素,那么为什么还要使用*
?还有[
是干什么用的?手册说word
将被扩展以产生一种模式,但*[
究竟会扩展什么?(尤其是当ROW
只是一个数字并且没有[
字符可以匹配时???)
提前感谢!
我没有得到的是, [...]
word
*[
的设置究竟在做什么。
$ IFS=';' read -sdR -p $'E[6n' ROW COL
$ declare -p ROW
declare -- ROW=$'E[24'
它从$ROW
中删除E[
。
终端以以下格式的光标位置响应E[6n
(来源):
E[<row>;<column>R
当IFS
设置为;
和行分隔符R
时,ROW
被分配E[<row>
;${ROW#*[}
仅用于获取行号。
(特别是当 ROW 只是一个数字并且没有 [ 字符匹配时???)
这是错误的。获取光标位置会返回转义序列,而不仅仅是位置,这就是为什么您需要删除ESC
并[
。
(IFS=';' read -sdR -p $'E[6n' ROW COL; echo ${ROW#$'E'[};)
这也可以工作,并且可能更精确,因为它消除了预期的E
而不仅仅是任何东西。