Dati i nomi dei file come questi:
/the/path/foo.txt
bar.txt
Spero di ottenere:
foo
bar
Perché questo non funziona?
#!/bin/bash
fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname
Qual è il modo giusto per farlo?
Non è necessario chiamare il comando esterno basename
. Invece, puoi usare i seguenti comandi:
$ s=/the/path/foo.txt
$ echo ${s##*/}
foo.txt
$ s=${s##*/}
$ echo ${s%.txt}
foo
$ echo ${s%.*}
foo
Si noti che questa soluzione dovrebbe funzionare in tutte le recenti (post 2004) shell conformi a POSIX, (ad esempio bash
, dash
, ksh
, ecc.).
Fonte: Linguaggio dei comandi Shell 2.6.2 Espansione dei parametri
Maggiori informazioni sulle manipolazioni delle stringhe in bash: http://tldp.org/LDP/LG/issue18/bash.html
Il comando basename ha due diverse invocazioni; in una, specifichi solo il percorso, nel qual caso ti dà l'ultimo componente, mentre nell'altra dai anche un suffisso che rimuoverà. Quindi, potete semplificare il vostro codice di esempio usando la seconda invocazione di basename. Inoltre, fate attenzione a citare correttamente le cose:
pre> fbname=$(basename "$1" .txt) echo "$fbname" pre>