Я хочу проверить, соответствует ли входная строка путям к файлам из белого списка, и только после этого выполнить некоторую операцию.
Я делаю что-то вроде этого
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
).