При обращении к $ C
Если на файл Вы имеете в виду полный путь к файлу, то это задание действительно очень легко. Есть несколько способов сделать это.
Используя только POSIX Shell Globs и расширение параметров, вы можете сделать:
c='/home/user/working-root-directory/band-folder/album-name/music-file.mp3'
file=${c##*/}
album=${c#*"${c%/*/"$file"}"/}
band=${c#*"${c%/*/"$album"}"/}
band=${band%%/*} album=${album%%/*}
в основном это работает, обрезая строку из хвоста переменной, а затем обрезающая результаты из головки переменной. В последней строке любые нежелательные останки от хвоста отдаются. Возможно, легче понять с реальными мировыми данными. Если вы должны были обернуть вышеупомянутый фрагмент в оболочке с помощью SET -X
включен, вы увидите что-то вдоль этих строк, напечатанные в STDERR
:
+ c=/home/user/working-root-directory/band-folder/album-name/music-file.mp3
+ file=music-file.mp3
+ album=album-name/music-file.mp3
+ band=band-folder/album-name/music-file.mp3
+ band=band-folder
+ album=album-name
другой способ сделать это Состоит в том, чтобы использовать внутренний сепаратор полевой сепараторы Shell, чтобы разделить путь на /
границ.
set -f; IFS=/ #disable globbing so as not to gen more filenames
set -- $c #set the shell's arg array to split path
shift "$(($#-3))" #remove all but relevant fields
band=$1 album=$2 file=$3 #assign values
Вот еще немного Set -x
Выход:
+ c=/home/user/working-root-directory/band-folder/album-name/music-file.mp3
+ set -f
+ IFS=/
+ set -- '' home user working-root-directory band-folder album-name music-file.mp3
+ shift 4
+ band=band-folder
+ album=album-name
+ file=music-file.mp3
Проблемы воспроизведения сводятся к поставщику libc. А именно, похоже, что это ошибка в uclibc; см .: https://bugs.busybox.net/show_bug.cgi?id=4099
При определенных обстоятельствах, cut печатает первый символ поля 1 и все поле 2, когда ему предлагается напечатать поле 2 - так, например:
printf "4123\t2\t3\t4\t5\n" | cut -f 2
выводит 42; не только 2. Я запустил strace для этого разреза, и он показал, что cut печатает всю строку.
Ошибка, похоже, связана с тем, как он хочет обрабатывать строки без разделителей; так что на данный момент обходной путь заключается в использовании флага '-s'; примерно так:
printf "4123\t2\t3\t4\t5\n" | cut -f 2 -s
, что, как и ожидалось, печатает «2».
Я полагаю, что большинство людей, сталкивающихся с этим, используют buildroot; и я бы порекомендовал изменить конфигурацию uclibc по этой ссылке. В основном это просто означает:
make uclibc-menuconfig
Select y for 'String and Stdio Support --> Provide a macro version of [getc|putc]'
обратите внимание, что поскольку это меняет реализацию libc; вероятно, разумно также перестроить практически все.