Обрабатывать имя файла с пробелами внутри Bash-скрипта

7319
ifischer

В моем Bash-скрипте я должен обрабатывать имена файлов с пробелами. Вот важные строки в моем скрипте:

mp3file="/media/d/Music/zz_Hardcore/Sampler/Punk-O-Rama\ Vol.5\ \[MP3PRO\]/01\ -\ Nofx\ -\ Pump\ up\ the\ Valium.mp3" echo "Command: mp3info -x `echo $mp3file`" mp3info -x `echo $mp3file` 

К сожалению, команда не работает, потому что имя файла разделено:

mp3info: invalid option -- '\' mp3info: invalid option -- '\' Error opening MP3: /media/d/Music/zz_Hardcore/Sampler/Punk-O-Rama\: No such file or directory Error opening MP3: Vol.5\: No such file or directory Error opening MP3: \[MP3PRO\]/01\: No such file or directory Error opening MP3: Nofx\: No such file or directory Error opening MP3: Pump\: No such file or directory Error opening MP3: up\: No such file or directory Error opening MP3: the\: No such file or directory Error opening MP3: Valium.mp3: No such file or directory 

Я также попытался добавить пользовательский IFS, как я читал на некоторых форумах:

SAVEIFS=$IFS IFS=$(echo -en "\n\b") # Script like above IFS=$SAVEIFS 

Но, таким образом, я получаю ошибку

Error opening MP3: /media/d/Music/zz_Hardcore/Sampler/Punk-O-Rama\ Vol.5\ \[MP3PRO\]/01\ -\ Nofx\ -\ Pump\ up\ the\ Valium.mp3: No such file or directory 

Я пытался довольно долго, но я не могу заставить свой сценарий работать. Странно то, что если я запускаю ту же команду, которую мой сценарий должен создать вручную (повторяя ее внутри моего сценария) в командной консоли, это на самом деле работает. Но не внутри моего сценария. Есть намеки?

4
Я не знаю, что должен делать backspace в `IFS` (не говоря уже о backspace, я просто понял, что это может быть любой символ, и он существует для сохранения новой строки, которая в противном случае была бы отброшена), но вы можете установить` IFS` без использования `echo`:` IFS = $ '\ n'`. Кроме того, в одном месте вы используете обратные пометки, а в другом - `$ ()`. Форма `$ ()` является предпочтительной, поскольку она более читаема, может быть легко вложена и т. Д. Dennis Williamson 13 лет назад 1

1 ответ на вопрос

9
Cry Havok

Оберните имена переменных в кавычки:

mp3file="/media/music/Punk-O-Rama Vol.5 \[MP3PRO\]/01 - Nofx - Pump up the Valium.mp3" echo "Command: mp3info -x \"$mp3file\"" mp3info -x "$mp3file" 

Я также удалил лишние echoкоманды и экранирование, в котором нет необходимости.

Спасибо, это работает! Не знаю, почему настаивал на сохранении, избегая так много;) ifischer 13 лет назад 0