GNU/Linux >> Znalost Linux >  >> Linux

Náhrada parametrů Bash:Příkazový řádek vs. Skript?

Cvičím se substitucí parametrů v bash.

Napsal jsem následující fiktivní skript:

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

V zásadě je vzor určen k odstranění poslední části názvu souboru
.

Výsledkem spuštění fiktivního skriptu je:

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

zatímco eval Zadání obsahu skriptu nebo ekvivalentně přímého vstupu této sekvence příkazů do interaktivního shellu má za následek:

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

Vzor '.[0-9]*.ext' funguje, takže problém je jasně omezen na podřetězec '?(.random)' . Problém může být s ? , protože se jedná o vyhrazený znak v kontextu substituce parametrů. Pokud by to byl problém, očekával bych, že vzor buď selže, nebo uspěje stejně v obou případech.

Kde je pravděpodobně zřejmé úskalí?

Přijatá odpověď:

Problém může být v tom, že extglob shell je nastaven v interaktivním shellu, ale ne v shellu skriptu.

$ 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

Můžete tedy zkusit zadat shopt -s extglob hned za řádkem shebang ve skriptu.

Z referenční příručky Bash:

Pokud extglob možnost shell je povolena pomocí shopt vestavěné,
je rozpoznáno několik rozšířených operátorů shody vzorů….
Složené vzory lze vytvořit pomocí jednoho nebo více z následujících dílčích vzorů:

?(PATTERN-LIST)
    Odpovídá žádnému nebo jednomu výskytu daných vzorů.


Linux
  1. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

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

  3. Bash Echo Příkazový řádek spuštěn na samotném příkazovém řádku (ne ve skriptu)?

  1. Kdy používáte rozšíření ortézy?

  2. Jak předat obsah souboru jako parametr příkazového řádku?

  3. Automaticky zadávat vstup do příkazového řádku?

  1. Co dělá řádek '!/bin/sh -e'?

  2. ./configure :/bin/sh^M :špatný interpret

  3. Jak vytvořit soubor v Linuxu z okna terminálu?