当变量等于“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 系统上,与英语规则的偏差似乎仅限于i
和I
字母以及点是否存在于大写或小写版本上。
这意味着[[ ${VAR,,} = oui ]]
不能保证在每个区域设置中都匹配OUI
(即使当前版本中的错误bash
是固定的)。
答案2
保留现有命令,但在运行之前在线:
LINUX_CONF=$(echo $LINUX_CONF | awk '{ print tolower($0) }')
无论变量中存储的值的大小写如何,这都会强制替换值为小写。这会导致您的现有命令仅与一行额外的代码相匹配。