Базовое имя файла извлечения без пути и расширения в ударе [дубликат]

Этот вопрос уже имеет ответ здесь:

Учитывая имена файлов как они:

/the/path/foo.txt
bar.txt

Я надеюсь добраться:

foo
bar

Почему это не работает?

#!/bin/bash

fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname

Что правильный путь состоит в том, чтобы сделать это?

300
задан alex 16 November 2017 в 10:02
поделиться

2 ответа

Вам не нужно вызывать внешнюю команду 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

593
ответ дан 23 November 2019 в 01:27
поделиться

Команда basename имеет два разных вызова; в одном вы указываете только путь, и в этом случае он дает вам последний компонент, а в другом вы также указываете суффикс, который он удалит. Итак, вы можете упростить свой пример кода, используя второй вызов basename. Кроме того, будьте осторожны, чтобы правильно процитировать вещи:

fbname=$(basename "$1" .txt)
echo "$fbname"
271
ответ дан 23 November 2019 в 01:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: