bash - 变量的不区分大小写匹配

bash - 变量的不区分大小写匹配

当变量等于“no”时,此语法打印“linux”:

 [[ $LINUX_CONF = no ]] && echo "linux"

我将如何使用正则表达式(或类似的)以使比较不区分大小写?

答案1

标准型

无需使用该ksh-style[[...]]命令,您可以在此处使用标准sh case构造:

case $LINUX_CONF in
  ([Nn][Oo]) echo linux;;
  (*)        echo not linux;;
esac

或者单独命名每个可能的情况:

case $LINUX_CONF in
  (No | nO | NO | no) echo linux;;
  (*)                 echo not linux;;
esac

巴什

对于bash进行不区分大小写匹配的特定方法,您可以执行以下操作:

shopt -s nocasematch
[[ $LINUX_CONF = no ]] && echo linux

或者:

[[ ${LINUX_CONF,,} = no ]] && echo linux

(其中${VAR,,}是将字符串转换为小写的语法)。

您还可以在赋值时强制将变量转换为小写:

typeset -l LINUX_CONF

这也来自 ksh,并且也受 和bash支持zsh

其他外壳的更多变体:

桀骜

set -o nocasematch
[[ $LINUX_CONF = no ]] && echo linux

(与中相同bash)。

set -o extendedglob
[[ $LINUX_CONF = (#i)no ]] && echo linux

(比制造危险要小全部匹配不区分大小写)

[[ ${(L)LINUX_CONF} = no ]] && echo linux
[[ $LINUX_CONF:l = no ]] && echo linux

(转换为小写运算符)

set -o rematchpcre
[[ $LINUX_CONF =~ '^(?i)no\z' ]]

(PCRE语法)

克什93

[[ $LINUX_CONF = ~(i)no ]]

或者

[[ $LINUX_CONF = ~(i:no) ]]

请注意,除了[nN][oO]不区分大小写的匹配之外,上述所有方法都取决于用户的区域设置。世界各地并非所有人都同意给定字母的大写版本是什么,即使是 ASCII 字母也是如此。

在 ASCII 的实践中,至少在 GNU 系统上,与英语规则的偏差似乎仅限于iI字母以及点是否存在于大写或小写版本上。

这意味着[[ ${VAR,,} = oui ]]不能保证在每个区域设置中都匹配OUI(即使当前版本中的错误bash是固定的)。

答案2

保留现有命令,但在运行之前在线:

LINUX_CONF=$(echo $LINUX_CONF | awk '{ print tolower($0) }')

无论变量中存储的值的大小写如何,这都会强制替换值为小写。这会导致您的现有命令仅与一行额外的代码相匹配。

相关内容