加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 负参数在参数扩展中如何在extglob中工作

发布时间:2020-12-15 22:59:48 所属栏目:安全 来源:网络整理
导读:问题 的行为 !(pattern-list) 特别是在参数扩展中使用时,我的工作方式不正常 ${parameter/pattern/string} 输入 a="1 2 3 4 5 6 7 8 9 10" 测试用例 $printf "%sn" "${a/!([0-9])/}"[blank]#expected 12 3 4 5 6 7 8 9 10$printf "%sn" "${a/!(2)/}"[blank
问题

的行为

!(pattern-list)

特别是在参数扩展中使用时,我的工作方式不正常

${parameter/pattern/string}

输入

a="1 2 3 4 5 6 7 8 9 10"

测试用例

$printf "%sn" "${a/!([0-9])/}"
[blank]
#expected 12 3 4 5 6 7 8 9 10

$printf "%sn" "${a/!(2)/}"
[blank]
#expected  2 3 4 5 6 7 8 9 10

$printf "%sn" "${a/!(*2*)/}"
2 3 4 5 6 7 8 9 10
#Produces the behaviour expected in previous one,not sure why though

$printf "%sn" "${a/!(*2*)/,}",2 3 4 5 6 7 8 9 10
#Expected after previous worked

$printf "%sn" "${a//!(*2*)/}"
2
#Expected again previous worked

$printf "%sn" "${a//!(*2*)/,2,#Why are there 3 commas???

眼镜

GNU bash,version 4.2.46(1)-release (x86_64-redhat-linux-gnu)

笔记

这些是非常基本的例子,所以如果可以在答案中包含更复杂的例子和解释,那么请做.

更多信息或示例需要在评论中告诉我.

已经看过How does extglob work with shell parameter expansion?了,甚至评论了这个特定问题的问题,所以请不要标记为欺骗.

解决方法

${parameter / pattern / string}形式的参数扩展(其中pattern不以/开头)的工作原理是找到与模式模式匹配的变量参数值中最左边最长的子字符串,并将其替换为字符串.换句话说,$参数被分解为三个部分前缀,匹配和后缀等

> $parameter ==“${prefix} ${match} ${suffix}”
> $prefix是最短的字符串,可以满足其他要求(即匹配,如果可能的话,发生在最左边的位置)
> $match匹配模式并且尽可能长
> $prefix,$match和/或$suffix中的任何一个都可以为空

${parameter / pattern / string}的结果是“${prefix} string ${suffix}”.

对于这种类型的参数扩展的全局替换形式(${parameter // pattern / string}),对后缀部分递归地执行相同的过程,但是a zero-length match is handled as a special case(为了防止无限递归):

> if“${prefix} ${match}”!=“”

"${parameter//pattern/string}" = "${prefix}string${suffix//pattern/string}"

else suffix = ${parameter:1}和

"${parameter//pattern/string}" = "string${parameter:0:1}${suffix}//pattern/string}"

现在让我们分析一下这些案例:

>“${a /!([0-9])/}” – > prefix =”match =’1 2 3 4 5 6 7 8 9 10’后缀=”.实际上,’1 2 3 4 5 6 7 8 9 10’不是由单个数字组成的字符串,因此它匹配模式!([0-9]).因此,扩张的空洞结果.>“${a /!(2)/}” – > prefix =”match =’1 2 3 4 5 6 7 8 9 10’后缀=”.与上述类似,’1 2 3 4 5 6 7 8 9 10’不是由单个字符’2’组成的字符串,因此它与模式匹配!(2).因此,扩张的空洞结果.>“${a /!(* 2 *)/}” – > prefix =”match =’1’后缀=’2 3 4 5 6 7 8 9 10′.子串’1’与模式* 2 *不匹配,因此它匹配模式!(* 2 *).>“${a /!(* 2 *)/,}”.这里没有惊喜,所以不需要详细说明.>“${a //!(* 2 *)/}”.这里没有惊喜,所以不需要详细说明.>“${a //!(* 2 *)/,}” – > prefix =”match =’1’后缀=’2 3 4 5 6 7 8 9 10′.然后${suffix //!(* 2 *)/,}扩展为“,2”,如下所示.后缀开头的空字符串与模式!(* 2 *)匹配,在结果中生成一个额外的逗号.由于触发了零长度匹配特殊情况(如上所述),强制消耗后缀的第一个字符,留下’3 4 5 6 7 8 9 10′,其中匹配!(* 2 *)模式整数并替换为我们在扩展的最终结果中看到的最后一个逗号.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读