LINUX.ORG.RU

В bash-скрипте неверно разбиваются строки

 ,


0

2

Есть скрипт:

#!/bin/bash
collection_in="$1"
collection_out="$2"

convert_func () {
	input="$1"
	corr_name=$(echo "${input/"$collection_in/"}" | sed 's/[\?\*\:]/_/g')
	output="$2/$corr_name"
	mkdir -p "$(dirname "$output")"
	if [[ $input == *.flac ]]
	then
		avconv -i "$input" -c:a libvorbis -q:a 10 "${output%.flac}".ogg < /dev/null
	else
		cp "$input" "$output"
	fi
}

export -f convert_func
export collection_in collection_out
find "$collection_in" -type f -printf '%P\n' | env SHELL=/bin/bash PARALLEL_SHELL=/bin/bash parallel -j+0 convert_func "$collection_in"/"{}" "$collection_out" 
Смысл и назначение: перекодировать музыку лежащую по пути «первый аргумент» и положить выхлоп, скопировав иерархию, во «второй аргумент».

Заметил, что если в составе первого аргумента есть пробел (даже хотя я его экранирую двойными кавычками или обратным слэшем), то внутри скрипта то, что до пробела обрабатывается, как отдельная строка => скрипт не работает. При этом, если первый аргумент без пробелов, то на пробелы ниже по вложенности скрипт реагирует хорошо. Вроде как, внутри скрипта экранирование везде правильное (или нет?). Пожалуйста, помогите разобраться (ну или если у кого будет критика по коду, буду очень рад).

Заранее спасибо.

★★

Просто не пиши на баше. Есть шанс, что не поседеешь.

anonymous ()

если в составе первого аргумента есть пробел ...

Описание 90% времени на написание любого sh скрипта.

anonymous ()

echo "${input/"$collection_in/"}"

Зачем столько кавычек?

h578b1bde ★☆ ()
Последнее исправление: h578b1bde (всего исправлений: 1)
Ответ на: комментарий от art_corp
+ collection_in='Nox Arcana'
+ collection_out=/tmp/музлоавв
+ export -f convert_func
+ export collection_in collection_out
+ find 'Nox Arcana' -type f -printf '%P\n'
+ env SHELL=/bin/bash PARALLEL_SHELL=/bin/bash parallel -j+0 convert_func 'Nox Arcana/{}' /tmp/музлоавв
mkdir: невозможно создать каталог «Arcana»: Отказано в доступе
cp: не удалось выполнить stat для «Nox»: Нет такого файла или каталога

Меня смущает третья снизу строка. Кажется, {} не подставляется. Или я ошибаюсь?

Сайт показал ещё одно место с излишними кавычками, исправление не спасло.

Norong ★★ ()
Ответ на: комментарий от art_corp

Сделал, теперь:

#!/bin/bash
collection_in="$1"
collection_out="$2"

convert_func () {
	input="$1"
	corr_name=$(echo "${input/$collection_in/}" | sed 's/[\?\*\:]/_/g')
	output="$2/$corr_name"
	mkdir -p "$output"
	if [[ $input == *.flac ]]
	then
		avconv -i "$input" -c:a libvorbis -q:a 10 "${output%.flac}".ogg < /dev/null
	else
		cp "$input" "$output"
	fi
}

export -f convert_func
export collection_in collection_out
find "$collection_in" -type f -printf '%P\n' | env SHELL=/bin/bash PARALLEL_SHELL=/bin/bash parallel -j+0 convert_func "$collection_in/{}" "$collection_out"
Но проблема не исчезла. Да и правильно ли делать mkdir -p путь_к_конечному_файлу? Ведь тогда же создастся директория с именем файла, мне нужно именно создать иерархию до него.

Norong ★★ ()
Ответ на: комментарий от Norong

Да и правильно ли делать mkdir -p путь_к_конечному_файлу?

В вашем случае неправильно. Хотя если вы хотите иметь такие пути: Nox Arcana/15 - Solitary Confinement.flac/15 - Solitary Confinement.ogg, то вполне.

batekman ★★★ ()
Ответ на: комментарий от batekman

Нет, мне хочется получить именно то, что делает исходный скрипт в шапке, но с исправлением описанной в шапке ошибки.

Norong ★★ ()
Ответ на: комментарий от Norong

У тебя проблема вот здесь:
convert_func «$collection_in»/«{}» «$collection_out» это все преобразуется в convert_func значение_collection_in_без_ковычек

art_corp ()
Ответ на: комментарий от art_corp

А почему? После проверки шеллчекером я там кавычки убрал вокруг слэша, но все равно все так же

Norong ★★ ()

по-моему bash сепарирует по умолчанию по пробелу

fMad ★★ ()
Ответ на: $IFS от fMad

Прочитал, но по-прежнему не понял сути. У меня же, вроде, везде переменные экранированы и должны восприниматься, как единая строка. ЧЯДНТ?

Norong ★★ ()

Проблема решена. Надо было лишь добавить parallel параметр -q

Norong ★★ ()

Зачем ты parallel используешь? У него замороченный синтаксис и экранирование, напиши просто на bash

anonymous ()
Ответ на: комментарий от Norong

Ты всё верно делаешь, в общем, просто parallel работает не так как bash :-)

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.