Как я могу получить первое расширение имени файла в сценарии оболочки?

Есть ли встроенная команда, которую можно использовать для получения первого расширения файла?

Я использую следующую команду, чтобы получить последнюю версию:

FILE="filename.tar.bz2"
EXT="${FILE##*.}"
echo "EXT = ${EXT}"

который возвращается

EXT = bz2

Есть ли аналогичная команда для выделения только «tar»?


person ogs    schedule 09.06.2020    source источник
comment
Что basename делает в вашем коде?   -  person KamilCuk    schedule 10.06.2020
comment
@KamilCuk ты прав, вот часть можно удалить (отредактировать)   -  person ogs    schedule 10.06.2020


Ответы (4)


var="config/filename.tar.bz2"
ext=$(basename "$var")    # extract filename only
ext=${ext#*.}             # remove everything in front the first dot
ext=${ext%%.*}            # remove everything after a dot
echo "$ext"

Примечание: переменные верхнего регистра по соглашению используются для экспортируемых переменных, таких как COLUMNS, LINES UID PWD TERM и т. Д. Предпочитайте использовать переменные нижнего регистра в ваших скриптах.

person KamilCuk    schedule 09.06.2020
comment
Не могли бы вы взглянуть на этот вопрос https://stackoverflow.com/questions/62292634/generate-where-clause-in-bash-using-variables - person nmr; 10.06.2020
comment
Итак, я рассмотрел этот вопрос, аааи? (Вы как-то пытаетесь продвигать свой вопрос? Пожалуйста, не делайте этого ..) - person KamilCuk; 10.06.2020

Расширение хорошего ответа от @KamilCuk с использованием только грамматики оболочки POSIX и без вызова внешней командной суб-оболочки:

#!/usr/bin/env sh

filepath="/path/to/config/filename.tar.bz2.bak"
echo 'filepath:' "$filepath"

# remove everything upto and including last /
filename="${filepath##*/}"
echo 'filename:' "$filename"

# remove everything until and including first dot
all_extensions="${filename#*.}"
echo 'all_extensions:' "$all_extensions"

# remove everything from and including first dot
first_extension="${all_extensions%%.*}"

echo 'First extension:' "$first_extension"

last_extension="${all_extensions##*.}"
echo 'Last extension:' "$last_extension"

# Fill argument array with extensions
IFS='.'; set -- $all_extensions

if [ $# -gt 0 ]
then
  ext_num=1
  printf '\nIterating all %d extensions:\n' $#
  printf '%s\t%s\n' 'ext#' 'extension'
  for extension
  do
    printf '%4d\t%s\n' "$ext_num" "$extension"
    ext_num="$((ext_num+1))"
  done
fi

Выход:

filepath: /path/to/config/filename.tar.bz2.bak
filename: filename.tar.bz2.bak
all_extensions: tar.bz2.bak
First extension: tar
Last extension: bak

Iterating all 3 extensions:
ext#    extension
   1    tar
   2    bz2
   3    bak
person Léa Gris    schedule 10.06.2020

echo "filename.tar.gz" | awk -F "." '{print $2}'

Это выводит первый экземпляр строки между точками. В данном случае tar.

person Justin Bodnar    schedule 09.06.2020

person    schedule
comment
Он возвращает bz2, как я, но не tar, как ожидалось - person ogs; 10.06.2020