Il comando basename ha due diverse invocazioni; in uno specifichi solo il percorso, nel qual caso ti dà l'ultimo componente, mentre nell'altro dai anche un suffisso che rimuoverà. Quindi, puoi semplificare il tuo codice di esempio usando la seconda invocazione di basename. Inoltre, fai attenzione a citare correttamente le cose:
fbname=$(basename "$1" .txt) echo "$fbname"
Ecco le battute:
$(basename "${s%.*}")
$(basename "${s}" ".${s##*.}")
Avevo bisogno di questo, lo stesso richiesto da bongbang e w4etwetewtwet.
Non devi chiamare il basename
esterno comando. Invece, puoi usare i seguenti comandi:
$ s=/the/path/foo.txt
$ echo "${s##*/}"
foo.txt
$ s=${s##*/}
$ echo "${s%.txt}"
foo
$ echo "${s%.*}"
foo
Tieni presente che questa soluzione dovrebbe funzionare in tutte le versioni recenti (post 2004 ) POSIX shell conformi, (ad es. bash
, dash
, ksh
, ecc.).
Fonte:Shell Command Language 2.6.2 Espansione dei parametri
Ulteriori informazioni sulla manipolazione delle stringhe bash:http://tldp.org/LDP/LG/issue18/bash.html
Una combinazione di basename e cut funziona bene, anche in caso di doppia desinenza come .tar.gz
:
fbname=$(basename "$fullfile" | cut -d. -f1)
Sarebbe interessante se questa soluzione richiedesse meno potenza aritmetica di Bash Parameter Expansion.