(3 risposte)
Chiusa 3 anni fa.
Allora perché il seguente funziona, ovvero stampa la corrispondenza:
THE_REGEX='^test\/version[0-9]+([.][0-9]+)+$'
if [[ "$SOME_VAR" =~ $THE_REGEX ]]; then
echo "Match!"
fi
Ma quanto segue NON:
if [[ "$SOME_VAR" =~ '^test\/version[0-9]+([.][0-9]+)+$' ]]; then
echo "Match!"
fi
Qual è la differenza? È la stessa regex
Risposta accettata:
Non utilizzare le virgolette singole all'interno di [[
:
if [[ "$SOME_VAR" =~ ^test\/version[0-9]+([.][0-9]+)+$ ]]; then
echo "Match!"
fi
Dal manuale di GNU bash:https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html#Conditional-Constructs
Nota in particolare:
Qualsiasi parte del modello può essere citata per forzare la corrispondenza della parte tra virgolette come stringa .
Il manuale sembra suggerire di utilizzare la variabile preferita:
La memorizzazione dell'espressione regolare in una variabile della shell è spesso un modo utile per evitare problemi con le virgolette di caratteri speciali per la shell. A volte è difficile specificare un'espressione regolare letteralmente senza usare le virgolette, o tenere traccia delle virgolette usate dalle espressioni regolari prestando attenzione alla rimozione delle virgolette della shell. L'utilizzo di una variabile shell per memorizzare il pattern riduce questi problemi.