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

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

$ 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| 
  • Как мне обращаться с каталогами, в которых есть пробелы в именах из `find`?
  • Перейдите в каталог, содержащий пробел
  • Трейлинг пространства при копировании из gnome-терминала с использованием zsh
  • Как я могу отредактировать мой скрипт bash для учета пробелов?
  • Zsh preexec - Как обрезать все ведущие отступы от кодового блока?
  • Rsyncing несколько файлов с пробелами в именах
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.