Что не так со следующим кодом?
name='$filename | cut -f1 -d'.''
Как есть, я получаю буквенную строку $filename | cut -f1 -d'.'
, но если я удаляю кавычки, я ничего не получаю. Между тем, набрав
"test.exe" | cut -f1 -d'.'
в оболочке дает мне вывод, который я хочу test
. Я уже знаю $filename
, было назначено правильное значение. Я хочу назначить переменной имя файла без расширения.
basename $filename .exe
сделал бы то же самое. Это при условии, что вы всегда знаете, какое расширение вы хотите удалить.basename "$filename" .exe
. В противном случае имена файлов с пробелами будут плохими новостями.Ответы:
Вы должны использовать синтаксис подстановки команд,
$(command)
когда хотите выполнить команду в сценарии / команде.Так что ваша линия будет
Объяснение кода:
echo
получить значение переменной$filename
и отправить его на стандартный выводcut
командеcut
Будет использовать. в качестве разделителя (также известного как разделитель) для разрезания строки на сегменты и-f
выбора того, какой сегмент мы хотим иметь в выводе$()
подстановка команды получит вывод и вернет его значениеname
Обратите внимание, что это дает часть переменной до первого периода
.
:источник
echo $filename | cut -f1 -d'.'
$()
является предпочтительным.Вы также можете использовать расширение параметров:
источник
echo -n "This.File.Has.Periods.In.It.txt" | awk -F. '{$NF=""; print $0}' | tr ' ' '.' | rev | cut -c 2- | rev
. Спасибо.image.png.gz
?%.*
удалит только последнее расширение; если вы хотите удалить все расширения, используйте%%.*
.Если вы знаете расширение, вы можете использовать базовое имя
источник
.wiki
и в конечном итоге/home/jsmith/base
?Если ваше имя файла содержит точку (отличную от расширения), используйте это:
источник
-s
задана опцияcut
, так что она возвращает пустую строку всякий раз, когда имя файла не содержит точки.используйте то, что вы хотите. Здесь я предполагаю, что последняя
.
(точка), за которой следует текст, является расширением.источник
выходы:
Обратите внимание, что удаляется только последнее расширение.
источник
Моя рекомендация заключается в использовании
basename
.Это по умолчанию в Ubuntu, визуально простой код и имеет дело с большинством случаев.
Вот некоторые подслучаи для работы с пробелами и многоточечным / под-расширением:
Обычно он сначала избавляется от расширения
.
, но на нашем..
пути терпит неудачуВот важное примечание:
Тем не менее, вам все еще нужно думать о
.hidden_files
не ожидаемый "" результат. Чтобы это произошло, используйте
$HOME
или/home/user_path/
потому что bash снова "необычен" и не расширяет "~" (поиск bash BashPitfalls)
источник
выходы:
источник
Как указал Hawker65 в комментарии к ответу chepner, решение с наибольшим количеством голосов не заботится ни о нескольких расширениях (например, filename.tar.gz), ни о точках в остальной части пути (например, this.path / with). .dots / in.path.name). Возможное решение:
источник
Две проблемы с вашим кодом:
Я бы изменил ваш код на "name =` echo $ filename | cut -f 1 -d '.' `", как показано ниже (опять же, обратите внимание на обратные галочки, окружающие определение переменной name):
источник