Estoy practicando con la sustitución de parámetros en bash.
Escribí el siguiente script ficticio:
#!/bin/bash
var1="/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext"
var2="/some/path/to/file/the_file.arbitrary.n.ext.0.ext"
pattern='.[0-9]?(.random).ext'
echo "${pattern}"
echo "${var1/${pattern}/}"
echo "${var2/${pattern}/}"
Básicamente, el patrón está destinado a eliminar la última parte del nombre del archivo
.
Ejecutar el script ficticio da como resultado:
~$ ./dummy.sh
.[0-9]?(.random).ext
/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext
/some/path/to/file/the_file.arbitrary.n.ext.0.ext
mientras que eval ing el contenido de la secuencia de comandos o, de manera equivalente, la entrada directa de esa secuencia de comandos en el shell interactivo, da como resultado:
~$ eval "$(cat dummy.sh)"
.[0-9]?(.random).ext
/some/path/to/file/the_file.arbitrary.n.ext
/some/path/to/file/the_file.arbitrary.n.ext
El patrón '.[0-9]*.ext' funciona, por lo que el problema claramente se limita a la subcadena '?(.random)' . El problema podría ser con ? , ya que es un carácter reservado en el contexto de la sustitución de parámetros. Sin embargo, si ese fuera el problema, esperaría que el patrón fallara o tuviera el mismo éxito en ambos casos.
¿Dónde está el escollo probablemente más obvio?
Respuesta aceptada:
El problema puede ser que el extglob La opción de shell está configurada en el shell interactivo, pero no en el shell del script.
$ shopt -u extglob
$ echo "${var1/${pattern}/}"
/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext
$ shopt -s extglob
$ echo "${var1/${pattern}/}"
/some/path/to/file/the_file.arbitrary.n.ext
Entonces puedes intentar poner shopt -s extglob justo después de la línea shebang en el guión.
Del Manual de referencia de Bash:
Si el extglob la opción de shell está habilitada usando shopt integrado,
se reconocen varios operadores de coincidencia de patrones extendidos....
Los patrones compuestos se pueden formar usando uno o más de los siguientes subpatrones:
?(PATTERN-LIST)
Coincide con cero o una ocurrencia de los patrones dados.