L' ==operatore viene utilizzato per confrontare due stringhe nello script di shell. Tuttavia, voglio confrontare due stringhe ignorando il caso, come si può fare? Esiste un comando standard per questo?
L' ==operatore viene utilizzato per confrontare due stringhe nello script di shell. Tuttavia, voglio confrontare due stringhe ignorando il caso, come si può fare? Esiste un comando standard per questo?
Risposte:
se hai la bash
str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
$str2 ) echo "match";;
*) echo "no match";;
esac
altrimenti, dovresti dirci quale shell stai usando.
alternativa, usando awk
str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
if ( tolower(s1) == tolower(s2) ){
print "match"
}
}'
==viene utilizzato per confrontare due stringhe, ma la risposta dimostra un confronto senza distinzione tra maiuscole e minuscole utilizzando caseun'istruzione. Rassicurante, la shoptsoluzione consente anche l'uso-insensitive caso ==, =~e altri operatori di confronto stringa.
shopt -u nocasematchdopo che il confronto è stato fatto al fine di ripristinare il valore predefinito di bash.
nocasematchimpostazione. Prendilo con SHELLNOCASEMATCH=`shopt -p nocasematch`poi cambiarlo con shopt -s nocasematche una volta fatto, ripristinalo con$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)perché shopt -puscirà con il codice 1 se l'opzione non è impostata e questo può causare l'interruzione dello script se set -eè attiva.
In Bash, puoi utilizzare l'espansione dei parametri per modificare una stringa in tutte le lettere minuscole / maiuscole:
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
echoaffermazione risulta in:-bash: ${var1,,}: bad substitution
shopt -s nocasematchsia implementato, ma di solito tali soluzioni "a livello di lingua" lo gestiscono correttamente.
Tutte queste risposte ignorano il modo più semplice e veloce per farlo (purché tu abbia Bash 4):
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
Tutto quello che stai facendo è convertire entrambe le stringhe in minuscolo e confrontare i risultati.
Salvare lo stato di nocasematch (nel caso in cui un'altra funzione dipenda dal fatto che sia disabilitata):
local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch
Nota: utilizzare solo localse si trova all'interno di una funzione.
casedichiarazioni (comprese quelle nella risposta di ghostdog) mi faranno sempre strisciare la pelle
Un modo sarebbe convertire entrambe le stringhe in alto o in basso:
test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different
Un altro modo sarebbe usare grep:
echo "string" | grep -qi '^String$' && echo same || echo different
trmetodo nelle mie applicazioni docker basate su alpine (che fornisce shvia busybox). Grazie.
Per la shell korn, uso il comando integrato di tipo (-l per le lettere minuscole e -u per le maiuscole).
var=True
typeset -l var
if [[ $var == "true" ]]; then
print "match"
fi
Molto facile se devi fare un confronto tra maiuscole e minuscole:
str1="MATCH"
str2="match"
if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
echo "case-insensitive match";
fi
grepha un -iflag che significa che non fa distinzione tra maiuscole e minuscole, quindi chiedigli di dirti se var2 è in var1.
var1=match
var2=MATCH
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
echo "MATCH"
fi
La zshsintassi è leggermente diversa, ma comunque più corta della maggior parte delle risposte qui:
> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>
Questo convertirà entrambe le stringhe in maiuscolo prima del confronto.
Un altro metodo utilizza zsh globbing flags, che ci consente di utilizzare direttamente la corrispondenza senza distinzione tra maiuscole e minuscole utilizzando il iflag glob:
setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"
[[ $str1 = (#i)match ]] && echo "Match success"
shopt -s nocaseglob
Mi sono imbattuto in questo fantastico blog / tutorial / qualunque cosa abbia a che fare con il modello case sensitive . I seguenti tre metodi sono spiegati in dettaglio con esempi:
1. Converti il motivo in minuscolo usando il comando tr
opt=$( tr '[:upper:]' '[:lower:]' <<<"$1" )
case $opt in
sql)
echo "Running mysql backup using mysqldump tool..."
;;
sync)
echo "Running backup using rsync tool..."
;;
tar)
echo "Running tape backup using tar tool..."
;;
*)
echo "Other options"
;;
esac
2. Usa regex con modelli di case
opt=$1
case $opt in
[Ss][Qq][Ll])
echo "Running mysql backup using mysqldump tool..."
;;
[Ss][Yy][Nn][Cc])
echo "Running backup using rsync tool..."
;;
[Tt][Aa][Rr])
echo "Running tape backup using tar tool..."
;;
*)
echo "Other option"
;;
esac
3. Attiva nocasematch
opt=$1
shopt -s nocasematch
case $opt in
sql)
echo "Running mysql backup using mysqldump tool..."
;;
sync)
echo "Running backup using rsync tool..."
;;
tar)
echo "Running tape backup using tar tool..."
;;
*)
echo "Other option"
;;
esac
shopt -u nocasematch
ifistruzioni, l'shoptapproccio richiede di usare la[[ ]]forma a doppia parentesi di condizionale anziché la[ ]forma a parentesi singola . Vedi anche: gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html