理解 IFS=';' 中的最后一个 'echo' read -sdR -p $'\E[6n' ROW COL; ech



我一直在阅读 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而不仅仅是任何东西。

相关内容

最新更新