Этот вопрос уже имеет ответ здесь:
Учитывая имена файлов как они:
/the/path/foo.txt
bar.txt
Я надеюсь добраться:
foo
bar
Почему это не работает?
#!/bin/bash
fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname
Что правильный путь состоит в том, чтобы сделать это?
Вам не нужно вызывать внешнюю команду basename
. Вместо этого вы можете использовать следующие команды:
$ s=/the/path/foo.txt
$ echo ${s##*/}
foo.txt
$ s=${s##*/}
$ echo ${s%.txt}
foo
$ echo ${s%.*}
foo
Обратите внимание, что это решение должно работать во всех последних ( post 2004 ) POSIX совместимых оболочках (например, bash
, тире
, ksh
и т. Д.).
Источник: Язык команд оболочки 2.6.2 Расширение параметров
Подробнее о манипуляциях со строками в bash: http://tldp.org/LDP/LG/issue18/bash.html
Команда basename имеет два разных вызова; в одном вы указываете только путь, и в этом случае он дает вам последний компонент, а в другом вы также указываете суффикс, который он удалит. Итак, вы можете упростить свой пример кода, используя второй вызов basename. Кроме того, будьте осторожны, чтобы правильно процитировать вещи:
fbname=$(basename "$1" .txt) echo "$fbname"