Quiero verificar si una cadena de entrada coincide con las rutas de archivo incluidas en la lista blanca, luego solo quiero realizar alguna operación.
estoy haciendo algo como esto
path1="mydir/**"
path2="mydir/testing"
[ [ "$path2" =~ "$path1" ] ] && echo "Matches"
¿Dónde, si los caminos son como
mydir/test/dir
mydir/othertest/dir
Estos deberían pasar.
La verificación anterior me está dando un error.
assets/bin/copymain: line 8: [: too many arguments
Respuesta1
Tenga en cuenta que si el único requisito es comparar rutas/cadenas que terminan o comienzan de cierta manera, entonces no se necesitan expresiones regulares:
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
Respuesta2
path1="mydir/**"
path2="mydir/testing"
Aquí path1="mydir/**"
se utiliza un patrón global que es un lenguaje totalmente diferente al de la expresión regular extendida utilizada en la comparación.
[ [ "$path2" =~ "$path1" ] ] && echo "Matches"
Pero las condiciones utilizan una expresión regular:
[[ "$path2" =~ "$path1" ]]
No agregue espacios entre [ [
y ] ]
pero [[
y]]
La expansión de parámetros global y Regex son dos lenguajes de patrones diferentes.
Si $path1
contiene el patrón de lista blanca, debe escribirlo en RegEx de esta manera:
path1='^mydir/'
path2="mydir/testing"
[[ ${path2} =~ ${path1} ]] && echo "Matches"
El lado derecho es la variable RegEx path1
y no se debe citar, ya que eso haría que los operadores de expresiones regulares (como los ^
anteriores) se tomen literalmente (a menos que configure la compat31
opción o establezca BASH_COMPAT=3.1
).