Linux

bash - 不區分大小寫的變數匹配

  • March 22, 2022

當變數等於“no”時,此語法列印“linux”:

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

我將如何使用正則表達式(或類似表達式)以使比較不區分大小寫?

標準sh

無需使用該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 並且也受bashand支持zsh

其他外殼的更多變體:

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 語法)

ksh93

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

或者

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

請注意,除了[nN][oO]進行不區分大小寫的匹配之外,上述所有方法都取決於使用者的語言環境。並非世界各地的所有人都同意給定字母的大寫版本,即使是 ASCII 字母也是如此。

在 ASCII 的實踐中,至少在 GNU 系統上,與英文規則的偏差似乎僅限於iI字母,以及大寫或小寫版本上是否存在點。

這意味著[[ ${VAR,,} = oui ]]不能保證OUI在每個語言環境中都匹配(即使目前版本中的錯誤bash已修復)。

引用自:https://unix.stackexchange.com/questions/395685