Bash 使用负先行错误的双括号正则表达式比较 return 2
Bash double bracket regex comparison using negative lookahead error return 2
在 Bash 4.1 机器上,
我正在尝试使用“双括号”[[ expression ]]
通过“NEGATIVE LOOKAHEAD”进行 REGEX 比较。
我做了“set +H
”来禁用 BASH 变量'!
'扩展到命令历史搜索。
我想匹配“任何字符串”除了“arm-trusted-firmware”。
set +H
if [[ alsa =~ ^(?!arm-trusted-firmware).* ]]; then echo MATCH; else echo "NOT MATCH"; fi
我希望它打印 "MATCH" 回来,
但它打印 "NOT MATCH".
查看 "double bracket" 的 return 代码后,
它 returns "2":
set +H
[[ alsa =~ ^(?!arm-trusted-firmware).* ]]
echo $?
根据 bash 手册,
return 值 '2' 表示 "the regular expression is syntactically incorrect":
An additional binary operator, =~, is available,
with the same precedence as == and !=.
When it is used,
the string to the right of the operator is considered
an extended regular expression and matched accordingly (as in regex(3)).
The return value is 0 if the string matches the pattern, and 1 otherwise.
If the regular expression is syntactically incorrect,
the conditional expression's return value is 2.
我做错了什么?
在我原来的剧本中,
我正在与字符串列表进行比较。
当它匹配时,我触发一些函数调用;
当它不匹配时,我会跳过我的操作。
所以,是的,从这个例子来看,
我实际上是在比较 'alsa' 和 'arm-trusted-firmware' 之间的字符串。
恭敬,您是不是把事情复杂化了?
if [ "$alsa" = arm-trusted-firmware ]
then
echo 'MATCH'
else
echo 'NOT MATCH'
fi
如果你有充分的理由想要使用 Bashism [[
,它会起作用
你最好提供一个例子来证明它。
默认情况下 bash POSIX 标准不支持 PCRE。 (source: Wiki Bash Hackers)
作为解决方法,您需要启用 extglob
。这将启用一些扩展的全局模式:
$ shopt -s extglob
查看 Wooledge Wiki 以阅读有关 extglob
的更多信息。
然后你就可以使用这样的模式了:
?(pattern-list) Matches zero or one occurrence of the given patterns
*(pattern-list) Matches zero or more occurrences of the given patterns
+(pattern-list) Matches one or more occurrences of the given patterns
@(pattern-list) Matches one of the given patterns
!(pattern-list) Matches anything except one of the given patterns
更多关于在 Wiki Bash Hackers and LinuxJournal 扩展 BASH globbing 的信息。
感谢@Barmar
的回答
BASH
不支持“lookaround”(lookahead and lookbehind)
bash
doesn't use PCRE
, and doesn't support lookarounds.
在 Bash 4.1 机器上,
我正在尝试使用“双括号”[[ expression ]]
通过“NEGATIVE LOOKAHEAD”进行 REGEX 比较。
我做了“set +H
”来禁用 BASH 变量'!
'扩展到命令历史搜索。
我想匹配“任何字符串”除了“arm-trusted-firmware”。
set +H
if [[ alsa =~ ^(?!arm-trusted-firmware).* ]]; then echo MATCH; else echo "NOT MATCH"; fi
我希望它打印 "MATCH" 回来, 但它打印 "NOT MATCH".
查看 "double bracket" 的 return 代码后, 它 returns "2":
set +H
[[ alsa =~ ^(?!arm-trusted-firmware).* ]]
echo $?
根据 bash 手册, return 值 '2' 表示 "the regular expression is syntactically incorrect":
An additional binary operator, =~, is available, with the same precedence as == and !=.
When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)).
The return value is 0 if the string matches the pattern, and 1 otherwise. If the regular expression is syntactically incorrect, the conditional expression's return value is 2.
我做错了什么?
在我原来的剧本中, 我正在与字符串列表进行比较。
当它匹配时,我触发一些函数调用;
当它不匹配时,我会跳过我的操作。
所以,是的,从这个例子来看,
我实际上是在比较 'alsa' 和 'arm-trusted-firmware' 之间的字符串。
恭敬,您是不是把事情复杂化了?
if [ "$alsa" = arm-trusted-firmware ]
then
echo 'MATCH'
else
echo 'NOT MATCH'
fi
如果你有充分的理由想要使用 Bashism [[
,它会起作用
你最好提供一个例子来证明它。
默认情况下 bash POSIX 标准不支持 PCRE。 (source: Wiki Bash Hackers)
作为解决方法,您需要启用 extglob
。这将启用一些扩展的全局模式:
$ shopt -s extglob
查看 Wooledge Wiki 以阅读有关 extglob
的更多信息。
然后你就可以使用这样的模式了:
?(pattern-list) Matches zero or one occurrence of the given patterns
*(pattern-list) Matches zero or more occurrences of the given patterns
+(pattern-list) Matches one or more occurrences of the given patterns
@(pattern-list) Matches one of the given patterns
!(pattern-list) Matches anything except one of the given patterns
更多关于在 Wiki Bash Hackers and LinuxJournal 扩展 BASH globbing 的信息。
感谢@Barmar
的回答BASH
不支持“lookaround”(lookahead and lookbehind)
bash
doesn't usePCRE
, and doesn't support lookarounds.