GNU/Linux >> Linux Esercitazione >  >> Linux

Perché la Regex in Bash funziona solo se è una variabile e non direttamente??

Questa domanda ha già risposte qui :shell verifica se la stringa di più righe contiene il modello specificato nell'ultima riga

(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.


Linux
  1. Navigazione nella shell Bash con pushd e popd

  2. Personalizzazione della shell Bash

  3. Come ottenere il proprio indirizzo IP e salvarlo in una variabile in uno script di shell?

  4. Lo scopo di .bashrc e come funziona?

  5. Perché Bashrc controlla se la shell corrente è interattiva?

Perché [a-z] corrisponde alle lettere minuscole in Bash?

Il comando Rm nello script Bash non funziona con la variabile?

Perché il documento Parent Shell Here non funziona per il sottocomando in Dash ma Bash funziona?

Qual è la differenza tra &> e >&in bash?

Perché Ctrl + V non incolla in Bash (shell Linux)?

Perché l'utente "bin" ha bisogno di una shell di login?