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.