GNU/Linux >> Znalost Linux >  >> Linux

Proč Regex v Bash funguje pouze v případě, že je proměnnou a ne přímo?

Tato otázka zde již obsahuje odpovědi :shell test, zda řetězec více řádků obsahuje zadaný vzor v posledním řádku

(3 odpovědi)
Uzavřeno před 3 lety.

Proč tedy funguje následující, tj. vytiskne shodu:

THE_REGEX='^test\/version[0-9]+([.][0-9]+)+$'
if [[ "$SOME_VAR" =~ $THE_REGEX ]]; then
    echo "Match!"
fi

Ale následující NE:

if [[ "$SOME_VAR" =~ '^test\/version[0-9]+([.][0-9]+)+$' ]]; then
    echo "Match!"
fi  

Jaký je rozdíl? Je to stejný regulární výraz

Přijatá odpověď:

Nepoužívejte jednoduché uvozovky uvnitř [[ :

if [[ "$SOME_VAR" =~ ^test\/version[0-9]+([.][0-9]+)+$ ]]; then
    echo "Match!"
fi

Z příručky GNU bash:https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html#Conditional-Constructs

Všimněte si zejména:

Jakákoli část vzoru může být uvedena v uvozovkách, aby se vynutila přiřazení části v uvozovkách jako řetězce .

Zdá se, že manuál naznačuje, že je preferováno použití proměnné:

Uložení regulárního výrazu do proměnné shellu je často užitečný způsob, jak se vyhnout problémům s uvozováním znaků, které jsou pro shell speciální. Někdy je obtížné určit regulární výraz doslovně bez použití uvozovek nebo sledovat citace používané regulárními výrazy a přitom věnovat pozornost odstranění uvozovek shellu. Použití proměnné shellu k uložení vzoru tyto problémy snižuje.


Linux
  1. Rozdíl mezi vestavěným příkazem a příkazem, který není?

  2. Účel .bashrc a jak to funguje?

  3. Proč Bashrc kontroluje, zda je aktuální shell interaktivní?

  1. Proč /bin/sh ukazuje na /bin/dash a ne /bin/bash?

  2. Variabilní rozsah pro skripty bash shell a funkce ve skriptu

  3. Shoda vzoru nefunguje ve skriptu bash

  1. Procházení shellu Bash pomocí pushd a popd

  2. Přizpůsobení prostředí Bash

  3. Proč se Ctrl + V nevloží do Bash (Linux shell)?