Bash 3.2.57(在macOS 12.6.8上)扩展的glob模式否定在参数替换中不起作用:
$ shopt -s extglob $ s=abc $ echo ${s##!(a)*}
我希望最后一个命令输出abc,但它没有输出任何东西。如果$s的第一个字符不是'a',我如何使第三行不输出任何内容,但如果第一个字符是'a',则输出$s?
abc
$s
'a'
pqwbnv8z1#
看到
$ shopt -s extglob $ [[ abc == a!(b)c ]] && echo yes || echo no no $ [[ ac == a!(b)c ]] && echo yes || echo no yes
man bash:
man bash
!(pattern-list)
匹配任何东西,除了给定模式之一所以这里的anything可以是空字符串。(我认为Bash的手册可以更明确地说明这一点。
tzdcorbm2#
如果$s的第一个字符不是'a',我如何使第三行不输出任何内容,但如果第一个字符是'a',则输出$s?
case $s in a*) echo $s;; esac # conditional execution
或
[[ $s =~ ^a ]] && echo $s # conditional execution
[[ ${s:0:1} == a ]] && echo $s # conditional execution
或者更像是你尝试过的
echo ${s/#[^a]*/} # string parsed to scrub nonmatch
不需要扩展的globbing。
2条答案
按热度按时间pqwbnv8z1#
看到
man bash
:!(pattern-list)
匹配任何东西,除了给定模式之一
所以这里的anything可以是空字符串。(我认为Bash的手册可以更明确地说明这一点。
tzdcorbm2#
如果$s的第一个字符不是'a',我如何使第三行不输出任何内容,但如果第一个字符是'a',则输出$s?
或
或
或者更像是你尝试过的
不需要扩展的globbing。