Příkaz basename má dvě různá vyvolání; v jednom zadáte pouze cestu, v takovém případě vám poskytne poslední komponentu, zatímco v druhém zadáte také příponu, kterou odstraní. Takže můžete zjednodušit svůj příklad kódu pomocí druhého vyvolání basename. Dávejte si také pozor, abyste věci správně citovali:
fbname=$(basename "$1" .txt) echo "$fbname"
Zde jsou vložky:
$(basename "${s%.*}")
$(basename "${s}" ".${s##*.}")
Potřeboval jsem to, stejně jako mě požádali bongbang a w4etwetewtwet.
Nemusíte volat externí basename
příkaz. Místo toho můžete použít následující příkazy:
$ s=/the/path/foo.txt
$ echo "${s##*/}"
foo.txt
$ s=${s##*/}
$ echo "${s%.txt}"
foo
$ echo "${s%.*}"
foo
Upozorňujeme, že toto řešení by mělo fungovat ve všech posledních (po roce 2004 ) POSIX vyhovující shelly, (např. bash
, dash
, ksh
, atd.).
Zdroj:Shell Command Language 2.6.2 Parameter Expansion
Více o manipulacích s bashovými strunami:http://tldp.org/LDP/LG/issue18/bash.html
Kombinace základního jména a řezu funguje dobře, dokonce i v případě dvojité koncovky jako .tar.gz
:
fbname=$(basename "$fullfile" | cut -d. -f1)
Bylo by zajímavé, kdyby toto řešení potřebovalo menší aritmetický výkon než Bash Parameter Expansion.