2009-11-13 14 views

risposta

44

se avete 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, utilizzando awk

str1="MATCH" 
str2="match" 
awk -vs1="$str1" -vs2="$str2" 'BEGIN { 
    if (tolower(s1) == tolower(s2)){ 
    print "match" 
    } 
}' 
+19

Per chiunque paragoni stringhe usando le istruzioni' if', l'approccio 'shopt' richiede che tu usi la forma a due parentesi' [[]] ' invece del modulo '[]' a parentesi singola. Vedi anche: http://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html – indiv

+2

La domanda indica che '==' è usato per confrontare due stringhe, ma la risposta dimostra caso- confronto insensibile usando una dichiarazione "caso". In modo rassicurante, la soluzione 'shopt' consente anche l'uso senza distinzione tra maiuscole e minuscole di' == ',' = ~ 'e altri operatori di confronto delle stringhe. – taranaki

+3

Probabilmente è saggio eseguire 'shopt -u nocasematch' dopo che il confronto è stato eseguito per tornare ai valori predefiniti di bash. –

1

shopt -s nocaseglob

+0

Nessun inserimento manuale per shopt.Its non disponibili sul mio sistema –

+1

nocasematch per archi. – ghostdog74

+0

@ghostdog, mi piace il tono –

11

Un modo sarebbe quello di convertire entrambe le stringhe di superiore o inferiore:

test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different 

Un altro modo sarebbe quello di utilizzare grep:

echo "string" | grep -qi '^String$' && echo same || echo different 
2
 
var1=match 
var2=MATCH 
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then 
    echo "MATCH" 
fi 
+2

benvenuto in stackoverflow.Puoi considerare di aggiungere una descrizione su come funziona per i futuri visitatori di questa domanda. –

+1

non funzionerà se sono presenti caratteri speciali regex in var2. – haridsv

+0

Risposta intelligente ... – jww

20

Come risposta dal ghostdog74 ma il codice leggermente diverso

shopt -s nocasematch 
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch" 
shopt -u nocasematch 
+1

Bello perché le istruzioni 'case' (comprese quelle nella risposta di ghostdog) faranno sempre la scansione della mia pelle – SeldomNeedy

6

Per shell korn, uso typeset comando integrato (-l per minori -case e -u per maiuscole).

var=True 
typeset -l var 
if [[ $var == "true" ]]; then 
    print "match" 
fi 
+2

Questo è il modo migliore, in termini di prestazioni rispetto all'avvio di awk o qualsiasi altro processo. – Alex

98

in bash, è possibile utilizzare l'espansione di parametro per modificare una stringa a tutti in basso a/maiuscole:

var1=TesT 
var2=tEst 

echo ${var1,,} ${var2,,} 
echo ${var1^^} ${var2^^} 
+8

Almeno una risposta che non implichi l'opzione shopt. Quindi puoi confrontare due casi di ignorare le stringhe e, nello stesso test, confrontarne altri due con il caso. Grazie – jehon

+26

Questo è nuovo in Bash 4? Almeno in Bash 3.2.51 (usato in OS X 10.9) non funziona - la prima istruzione 'echo' restituisce:' -bash: $ {var1 ,,}: sostituzione errata' –

+0

Tali implementazioni di confronto case-insensitive sono soggetto a problemi di localizzazione (come il problema turco I). Non so come sia implementato 'shopt -s nocasematch', ma in genere tali soluzioni" a livello di lingua "gestiscono correttamente. –

65

Tutte queste risposte ignorare il modo più semplice e veloce per fare questo (come finché si dispone di Bash 4):

if [ "${var1,,}" = "${var2,,}" ]; then 
    echo ":)" 
fi 

Tutto quello che sta facendo ci sta convertendo entrambe le stringhe di lettere minuscole e confrontando i risultati.

+3

La risposta più adatta. – Luciano

+1

Questo è disponibile solo in Bash 4 o versioni successive (ad esempio non su Mac OS X 10.11) – d4Rk

+1

@ d4Rk, motivo per cui la prima frase della mia risposta dice "finché hai Bash 4". Detto questo, Bash 4 è uscito da più di sette anni al momento della stesura di questo commento, e la mia installazione di OS X è durata quasi così a lungo. – Riot

2

Ecco la mia soluzione con tr:

var1=match 
var2=MATCH 
var1=`echo $var1 | tr '[A-Z]' '[a-z]'` 
var2=`echo $var2 | tr '[A-Z]' '[a-z]'` 
if [ "$var1" = "$var2" ] ; then 
    echo "MATCH" 
fi 
3

molto facile se si fgrep di fare una linea di case-insensitive confrontare:

str1="MATCH" 
str2="match" 

if [[ $(fgrep -ix $str1 <<< $str2) ]]; then 
    echo "case-insensitive match"; 
fi 
+0

Funziona anche per 'grep' e' egrep'? – jww

Problemi correlati