我们设置了以下变量
status=ok
echo $status
ok
现在我们要验证使用regex的变量是否匹配。
如下所示
[[ $status =~ [OK] ]] && echo "is the same"
[[ $status =~ OK ]] && echo "is the same"
[[ $status =~ "OK" ]] && echo "is the same"
但上述任何一种非印刷品“都是相同的”。
我的领地出什么问题了?
发布于 2020-11-10 11:06:02
[OK]
将匹配括号中的任一字符,方括号不会告诉它不区分大小写。
你可以这样做:
[[ "$status" =~ ^[Oo][Kk]$ ]]
或者我可能会做以下的事情:
[[ "${status,,}" == ok ]]
用于参数展开的,,
运算符将将整个变量转换为小写,以便进行比较。
发布于 2020-11-10 22:06:09
[[ $status =~ OK ]]
(或[[ $status =~ "OK" ]]
)匹配如果$status
包含 OK
,而[[ $status =~ [OK] ]]
匹配它<>包含该OK
集合中的一个字符,则为O
或K
。
对于正则表达式,如果要将主题作为一个整体而不是在主题中匹配,则需要使用^
或$
分别在主题的开头和结尾锚定模式。
要在bash
中执行不区分大小写的匹配,可以使用nocasematch
选项:
这适用于与Korn样式的[[ $var = pattern ]]
或标准case $var in (pattern)
的shell模式匹配,以及与[[ $var =~ regexp ]]
的regexp匹配。
所以,在这里你可以:
shopt -s nocasematch
[[ $status = ok ]] && echo yes
[[ $status =~ ^ok$ ]] && echo yes
case $status in
(ok) echo yes
esac
(您可能希望在结束后取消nocasematch
设置,或者将其重置为以前的值(请参阅typeset restore="$(shopt -p nocasematch)"
以保存,eval "$restore"
用于恢复),因为保持此状态将影响所有模式匹配操作)。
或者你可以用:
[[ $status = [oO][kK] ]] && echo yes
[[ $status =~ ^[oO][kK]$ ]] && echo yes
case $status in
([oO][kK]) echo yes
esac
case $status in
(ok | OK | Ok | oK) echo yes
esac
基于case
的变体是标准的POSIX sh
语法。
在zsh
外壳中,您可以使用扩展的globing操作符或PCRE操作符,而不是全局地打开全局nocasematch
选项(并扭曲所有模式匹配操作符),这些操作符可以选择性地对单个模式或单个模式的一部分启用不区分大小写的匹配。
例如,
set -o extendedglob
[[ $status = (#i)ok ]]
或者:
zmodload zsh/pcre
[[ $status -pcre-match '^(?i)ok或相当于bash's ${var,,},使用$var:làla csh或${(L)var}:[ "$status:l" = ok ]在zsh中,您应该避免使用名为$status的变量,因为该变量保存了前面命令的退出状态,并将其作为Bourne样式$?的别名,就像大多数非伯恩shell (csh、tcsh、rc、es、fish )一样。在Korn的ksh93变体(它的bash和zsh都复制了[[...]] )中,您可以执行[[ $status = ~(i)ok ]]。 ]]
或相当于D26
's D27
,使用D28
àla csh或D29
:D30
在D31
中,您应该避免使用名为D32
的变量,因为该变量保存了前面命令的退出状态,并将其作为Bourne样式D33
的别名,就像大多数非伯恩shell (csh、tcsh、rc、es、fish )一样。
在Korn的ksh93变体(它的bash和zsh都复制了D34
)中,您可以执行D35
。
发布于 2020-11-10 21:53:54
您可以这样做模式匹配:
[[ $status == @(ok|OK|okay) ]] && echo "is the same"
或者,类似于jesse在上一篇文章中的想法,用于参数展开的^^
操作符将将整个变量转换为大写,以便进行比较:
[[ "${status^^}" == OK ]] && echo "is the same"
https://unix.stackexchange.com/questions/618963
复制