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