Bash: Регулярное выражение для сравнения пути к файлу

Bash: Регулярное выражение для сравнения пути к файлу

Я хочу проверить, соответствует ли входная строка путям к файлам из белого списка, и только после этого выполнить некоторую операцию.

Я делаю что-то вроде этого

path1="mydir/**"
path2="mydir/testing"

[ [ "$path2" =~ "$path1" ] ] && echo "Matches"

Где, если пути такие

mydir/test/dir
mydir/othertest/dir

Это должно пройти.

Проверка выше выдает мне ошибку

assets/bin/copymain: line 8: [: too many arguments

решение1

Обратите внимание, если требуется только сравнить пути/строки, которые заканчиваются или начинаются определенным образом, то регулярные выражения не нужны:

d1=mydir/test/dir
d2=mydir/othertest/dir
d3=mydir-2/test/dir-2

[[ "$d1" == mydir/* ]] && echo matches
[[ "$d2" == mydir/* ]] && echo matches
[[ "$d3" != mydir/* ]] && echo no-match

[[ "$d1" == */dir ]] && echo matches
[[ "$d2" == */dir ]] && echo matches
[[ "$d3" != */dir ]] && echo no-match

решение2

path1="mydir/**"
path2="mydir/testing"

Здесь path1="mydir/**"используется шаблон подстановки, который представляет собой совершенно другой язык, нежели Extended RegEx, используемый при сравнении.

[ [ "$path2" =~ "$path1" ] ] && echo "Matches"

Но в условиях используется RegEx:

[[ "$path2" =~ "$path1" ]]

Не добавляйте пробелы между « [ [и» ] ], «но» [[и «]]

Подстановка параметров и Regex — это два разных языка шаблонов.

Если $path1содержит шаблон белого списка, то вы должны записать его в RegEx следующим образом:

path1='^mydir/'
path2="mydir/testing"

[[ ${path2} =~ ${path1} ]] && echo "Matches"

Правая часть — это переменная RegEx path1, и ее нельзя заключать в кавычки, так как это приведет к тому, что операторы регулярных выражений (такие как ^приведенные выше) будут восприниматься буквально (если только вы не установите опцию compat31или set BASH_COMPAT=3.1).

Связанный контент