Confronto di stringhe in Shell


4

Sto cercando di confrontare il mese corrente che ho ottenuto dalla data di utilità con l'input dell'utente. Anche quando sto dando a Oct come input, dà un risultato errato.

read -r month
current=`date +”%b”`
echo $current
if [ "$month" = "$current" ];
then
    echo "match"
else
    echo "no "
fi

Non sono in grado di capire perché dà sempre no come output. Qualsiasi aiuto è apprezzato.


1
Stai usando un editor non-ascii per creare il tuo script, dovresti passare a uno di ascii / utf8 e usare le virgolette regolari ( " ) e non gli altri ( )
Olivier Dulac

Risposte:


2

Eseguendo il tuo codice e inserendo Oct al prompt ottieni:

Oct         # this is what you input at the prompt
”Oct”       # this is what your input is compared against
no          # this is the result of the comparison: not true

Evidentemente, se hai immesso ”Oct” il confronto sarebbe vero:

”Oct”
”Oct”
match

Se non vuoi digitare i due chiudendo doppie virgolette , rimuovili dalla stringa di confronto:

read -r month
current=`date +%b`
echo $current
if [ "$month" = "$current" ];
then
    echo "match"
else
    echo "no "
fi

In questo modo, puoi semplicemente digitare Oct e corrisponderà Oct:

Oct
Oct
match

Se vuoi sviluppare ulteriormente il tuo programma, il passo successivo potrebbe essere quello di rendere il confronto senza distinzione tra maiuscole e minuscole: in questo modo i tuoi utenti potrebbero digitare oct, Oct o OCT senza prendersi cura del caso giusto.


2

C'è un errore molto evidente nel tuo codice.

Sono le virgolette attorno al formato della data

current=`date +”%b”`

vs

current=`date +"%b"` # this is the one you should be using

Quindi ho bisogno di rimuovere la citazione dalla data & amp; quindi confrontare, giusto?
Prashast

3
+1 perché hai risolto il problema delle virgolette. Comunque penso non c'è niente di sbagliato in confronto =.
Kamil Maciorowski

7
[ "$month" = "$current" ] è perfettamente bene e probabilmente più corretto di [ "$month" == "$current" ] perché il primo è POSIX e il secondo no. Correre dash -c '[ a == a ]] && echo yes' per esempio. = vs == è un problema tipo C, [ S = e == sono di solito equivalenti dove entrambi sono supportati.
muru

(Argh, errore di battitura nel mio esempio! ]] dovrebbe essere ].)
muru

2
@muru ha ragione: usa if [ "$month" = "$current" ]; . Non usare il ==. Il problema deriva dal fatto che OP ha aggiunto 2 caratteri extra: a $ corrente, quindi le 2 date potrebbero non essere uguali.
Olivier Dulac
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.