Glede na imena datotek, kot so ta:
/the/path/foo.txt
bar.txt
Upam, da bom dobil:
foo
bar
Zakaj to ne deluje?
#!/bin/bash
fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname
Kakšen je pravi način za to?
Zunanjega ukaza basename
vam ni treba klicati. Namesto tega lahko uporabite naslednje ukaze:
$ s=/the/path/foo.txt
$ echo ${s##*/}
foo.txt
$ s=${s##*/}
$ echo ${s%.txt}
foo
$ echo ${s%.*}
foo
Upoštevajte, da bi morala ta rešitev delovati v vseh novejših (po letu 2004) lupinah POSIX (npr. bash
, dash
, ksh
itd.).
Vir: Shell Command Language 2.6.2 Parameter Expansion
Več o manipulacijah nizov v bashu: http://tldp.org/LDP/LG/issue18/bash.html
Ukaz basename ima dva različna klica; v enem navedete samo pot, pri čemer vam ukaz poda zadnjo komponento, v drugem pa navedete tudi končnico, ki jo bo ukaz odstranil. Zato lahko kodo svojega primera poenostavite tako, da uporabite drugi ukaz basename. Prav tako bodite pozorni na pravilno navajanje citatov:
fbname=$(basename "$1" .txt) echo "$fbname"