L'operatore ==
viene utilizzato per confrontare due stringhe nello script della shell. Tuttavia, voglio confrontare due stringhe ignorando il caso, come può essere fatto? C'è qualche comando standard per questo?Confronto insensibile alle maiuscole/minuscole delle stringhe nello script shell
risposta
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"
}
}'
shopt -s nocaseglob
Nessun inserimento manuale per shopt.Its non disponibili sul mio sistema –
nocasematch per archi. – ghostdog74
@ghostdog, mi piace il tono –
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
var1=match var2=MATCH if echo $var1 | grep -i "^${var2}$" > /dev/null ; then echo "MATCH" fi
Come risposta dal ghostdog74 ma il codice leggermente diverso
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
shopt -u nocasematch
Bello perché le istruzioni 'case' (comprese quelle nella risposta di ghostdog) faranno sempre la scansione della mia pelle – SeldomNeedy
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
Questo è il modo migliore, in termini di prestazioni rispetto all'avvio di awk o qualsiasi altro processo. – Alex
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^^}
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
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' –
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. –
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.
La risposta più adatta. – Luciano
Questo è disponibile solo in Bash 4 o versioni successive (ad esempio non su Mac OS X 10.11) – d4Rk
@ 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
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
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
Funziona anche per 'grep' e' egrep'? – jww
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
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
Probabilmente è saggio eseguire 'shopt -u nocasematch' dopo che il confronto è stato eseguito per tornare ai valori predefiniti di bash. –