GNU/Linux >> Linux Esercitazione >  >> Linux

Sostituzione del parametro Bash:riga di comando vs. copione?

Mi sto esercitando con la sostituzione dei parametri in bash.

Ho scritto il seguente script fittizio:

#!/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}/}"

Fondamentalmente, il modello ha lo scopo di rimuovere l'ultima parte del nome del file
.

L'esecuzione dello script fittizio risulta in:

~$ ./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

mentre eval l'inserimento del contenuto dello script o, equivalentemente, l'input diretto di quella sequenza di comandi nella shell interattiva, risulta in:

~$ 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

Il modello '.[0-9]*.ext' funziona, quindi il problema è chiaramente limitato alla sottostringa '?(.random)' . Il problema potrebbe riguardare ? , poiché è un carattere riservato nel contesto della sostituzione di parametri. Tuttavia, se questo fosse il problema, mi aspetterei che il modello fallisca o riesca allo stesso modo in entrambi i casi.

Dov'è probabilmente l'ovvia trappola?

Risposta accettata:

Il problema potrebbe essere che extglob l'opzione shell è impostata nella shell interattiva, ma non nella shell dello 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

Quindi puoi provare a inserire shopt -s extglob subito dopo la riga shebang nello script.

Dal manuale di riferimento di Bash:

Se il extglob l'opzione shell è abilitata usando shopt builtin,
vengono riconosciuti diversi operatori di corrispondenza dei modelli estesi….
I modelli compositi possono essere formati utilizzando uno o più dei seguenti modelli secondari:

?(PATTERN-LIST)
    Corrisponde a zero o a un'occorrenza dei pattern indicati.


Linux
  1. In che modo Linux gestisce più separatori di percorsi consecutivi (/home////nomeutente///file)?

  2. Bash =~ Regex e HTTPS://regex101.com/?

  3. Bash Echo La riga di comando eseguita sulla riga di comando stessa (non in uno script)?

  4. Immettere automaticamente l'input nella riga di comando?

  5. Come far funzionare il comando alias nello script bash o nel file bashrc

Come leggere un file riga per riga in Bash

Comando sorgente Bash

35 Esempi di script Bash

Scripting Bash(III)

lo script bash aggiunge il testo alla prima riga di un file

Esegui il comando bash sulla pipeline jenkins