GNU/Linux >> Tutoriales Linux >  >> Linux

Sustitución de parámetros de Bash:línea de comandos vs. ¿Texto?

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.


Linux
  1. ¿Cómo maneja Linux múltiples separadores de rutas consecutivas (/home////username///file)?

  2. Bash =~ Regex y Https://regex101.com/?

  3. Bash Echo ¿La línea de comando se ejecutó en la propia línea de comando (no en un script)?

  4. ¿Cuándo se usa la expansión Brace?

  5. Cómo hacer que el comando de alias funcione en script bash o archivo bashrc

Cómo leer un archivo línea por línea en Bash

Comando de fuente Bash

35 ejemplos de secuencias de comandos Bash

Script Bash (III)

¿Ingresar automáticamente la entrada en la línea de comando?

chroot falla:no se puede ejecutar el comando '/bin/bash':no ​​existe tal archivo o directorio