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 case
un'istruzione. Rassicurante, la shopt
soluzione consente anche l'uso-insensitive caso ==
, =~
e altri operatori di confronto stringa.
shopt -u nocasematch
dopo che il confronto è stato fatto al fine di ripristinare il valore predefinito di bash.
nocasematch
impostazione. Prendilo con SHELLNOCASEMATCH=`shopt -p nocasematch`
poi cambiarlo con shopt -s nocasematch
e una volta fatto, ripristinalo con$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
perché shopt -p
uscirà 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^^}
echo
affermazione risulta in:-bash: ${var1,,}: bad substitution
shopt -s nocasematch
sia 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 local
se si trova all'interno di una funzione.
case
dichiarazioni (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
tr
metodo nelle mie applicazioni docker basate su alpine (che fornisce sh
via 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
grep
ha un -i
flag 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 zsh
sintassi è 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 i
flag 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
if
istruzioni, l'shopt
approccio 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