Передача аргументов с пробелами и кавычками в скрипт (без цитирования всего)

В командной строке отлично работает:

$ ffmpeg -i input.m4a -metadata 'title=Spaces and $pecial char'\''s' output.m4a 

Как мне параметризовать эту команду и использовать ее в скрипте / функции? Я хотел бы добавить несколько тегов метаданных, например:

 $ set-tags.sh -metadata 'tag1=abc' -metadata 'tag2=1 2 3' 

Обновить:

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

Это мой прецедентный случай:

Эта функция преобразует файлы в формат аудиокниг (определенный в .profile):

 # snippet of .profile convert_to_m4b () { FILE="$1" BASENAME=${FILE%.*}; shift ffmpeg -i "$FILE" -vn -ac 1 -ar 22050 -b:a 32k "$@" tmp.m4a && mv tmp.m4a "$BASENAME.m4b" }; export -f convert_to_m4b 

Функция convert_to_m4b вызывается из download-and-convert.sh:

 #/bin/sh MP3_URL=$1; shift FILENAME=$1; shift if [ ! -f "${FILENAME}.mp3" ]; then curl --location --output "${FILENAME}.mp3" "$MP3_URL" fi convert_to_m4b "${FILENAME}.mp3" "$@" 

Download-and-convert.sh вызывается из process-all.sh:

 #/bin/sh download-and-convert.sh http://1.mp3 'file 1' -metadata 'title=title 1' -metadata 'album=album 1' download-and-convert.sh http://2.mp3 'file 2' -metadata 'title=title 2' -metadata 'album=album 2' ... ... download-and-convert.sh http://3.mp3 'file N' -metadata 'title=title N' -metadata 'album=album N' 

Я получаю эту ошибку от ffmpeg:

 [NULL @ 00000000028fafa0] Unable to find a suitable output format for ''@'' '@': Invalid argument 

"$@" работает, если я встраиваю convert_to_m4b в download-and-convert.sh вместо вызова функции.


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

 #/bin/sh ffmpeg -i input.m4a $@ output.m4a 

Я пробовал различные методы цитирования $@ , но это также приводит к цитированию '-metadata' , поэтому аргумент командной строки не распознается должным образом.

Думаю, я хотел бы только окружать каждый аргумент кавычками, если бы этот аргумент был процитирован для начала. Это сложно сделать, потому что bash разбивает кавычки перед передачей аргументов скрипту / функции.

Или есть лучший способ ретрансляции аргументов -metadata ? (например, переменные среды или файлы)

One Solution collect form web for “Передача аргументов с пробелами и кавычками в скрипт (без цитирования всего)”

"$@" делает именно то, что вы хотите, если используете его последовательно. Вот вам небольшой эксперимент:

  • script1.sh :

     #! /bin/sh ./script2.sh "$@" 
  • script2.sh :

     #! /bin/sh ./script3.sh "$@" 
  • script3.sh :

     #! /bin/sh printf '|%s|\n' "$@" 

При этом аргументы остаются без изменений до конца:

 $ ./script1.sh -i input.m4a -metadata "title=Spaces and \$pecial char's" output.m4a |-i| |input.m4a| |-metadata| |title=Spaces and $pecial char's| |output.m4a| 
  • Почему vim сбрасывается в одно и то же положение после нескольких пробелов?
  • Заменяйте каждую вкладку ТОЛЬКО в начале каждой строки пробелами
  • Ошибка при замене части команды curl переменной
  • Как обрабатывать пробелы в именах путей, когда переменная содержит несколько путей
  • Перейдите в каталог, содержащий пробел
  • Git Server: игнорировать пробельные изменения в новых коммитах
  • Трейлинг пространства при копировании из gnome-терминала с использованием zsh
  • Rsyncing несколько файлов с пробелами в именах
  • Как автоматически снимать конечные пробелы при сохранении в Vi и Vim?
  • Interesting Posts

    Как установить программы в / usr / local, если они не должны компилироваться с помощью root?

    Как просмотреть имена файлов, чувствительных к регистру, для томов iso9660 / Joliet + UCS-3?

    Получите более 2 ГБ ограничений на создание PDF-файлов с помощью ImageMagick

    Резервное копирование на два внешних жестких диска с помощью rsync?

    Общая оперативная память, используемая программой с `ps`?

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

    Как я могу заменить модуль драйвера запаса в Linux ISO?

    / usr / bin / host не подбирает изменения в / etc / hosts даже после перезагрузки

    Ошибка сочленения Heartbeat 3

    C Shell: различные действия в зависимости от типа файла

    Как выполнить программу, когда вызывается текстовый файл и по-прежнему возвращает правильный текст

    Как объединить строки и цифры

    изменить размер окна шпаклевки по умолчанию

    Отключить или удалить по умолчанию vim keybinding

    Использование awk для редактирования чисел в столбце

    Linux и Unix - лучшая ОС в мире.