GNU/Linux >> Linux Esercitazione >  >> Linux

bash - corrispondenza senza distinzione tra maiuscole e minuscole della variabile

Caso standard

Non c'è bisogno di usare quel ksh -style [[...]] comando, puoi usare il comando standard sh case costruire qui:

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

O nominando individualmente ogni possibile caso:

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

bash

Per un bash -modo specifico per eseguire la corrispondenza senza distinzione tra maiuscole e minuscole, puoi eseguire:

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

Oppure:

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

(dove ${VAR,,} è la sintassi per convertire una stringa in lettere minuscole).

Puoi anche forzare la conversione di una variabile in minuscolo al momento dell'assegnazione con:

typeset -l LINUX_CONF

Anche questo deriva da ksh ed è supportato anche da bash e zsh .

Altre varianti con altre shell:

zsh

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

(come in bash ).

setopt extendedglob
[[ $LINUX_CONF = (#i)no ]] && echo linux

(meno pericoloso che creare tutto corrisponde alla distinzione tra maiuscole e minuscole)

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

(converti in operatore minuscolo)

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

(sintassi PCRE)

ksh93

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

o

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

Nota che tutti gli approcci precedenti tranne [nN][oO] per eseguire la corrispondenza senza distinzione tra maiuscole e minuscole dipende dalle impostazioni locali dell'utente. Non tutte le persone in tutto il mondo sono d'accordo su quale sia la versione maiuscola di una determinata lettera, anche per quelle ASCII.

In pratica per quelli ASCII, almeno sui sistemi GNU, le deviazioni dalle regole inglesi sembrano essere limitate al i e I lettere e se il punto è presente o meno nella versione maiuscola o minuscola.

Ciò significa che [[ ${VAR,,} = oui ]] non è garantito che corrisponda a OUI in ogni locale (anche quando il bug nelle versioni correnti di bash è fisso).


Mantieni il tuo comando esistente ma in linea prima che esegua questo:

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

Indipendentemente dal caso del valore memorizzato nella variabile, questo forzerà il valore di sostituzione ad essere minuscolo. Ciò comporta la corrispondenza del comando esistente con una sola riga di codice aggiuntiva.


Linux
  1. Script Bash(I)

  2. Perché impostare una variabile prima di un comando è legale in Bash?

  3. Come posso verificare se una variabile è un numero in Bash?

  4. Alias ​​con variabile in bash

  5. Corrispondenza del modello di script Bash

Dichiarazione Bash:sintassi ed esempi

Variabile di esportazione Bash

Bash printf - Come stampare una variabile in Bash

Bash Scripting:variabili spiegate con esempi

Come impostare la variabile d'ambiente in Bash

passando grep in una variabile in bash