как правильно передать _set_ параметров с пробелами в функцию оболочки

Моя проблема заключается не в простой передаче параметров с пробелами (я знаю, как это сделать), рассмотрим более сложный случай:

function build() { make CC="$1" CFLAGS="$2" $* # $* is not correct here! } build gcc "XXX" VAR1="ab" VAR2="c=A d=B" LDFLAGS="-L/opt/lib -lm" 

как эквивалент

 make CC=gcc CFLAGS=XXX VAR1="ab" VAR2="c=A d=B" LDFLAGS="-L/opt/lib -lm" 

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

One Solution collect form web for “как правильно передать _set_ параметров с пробелами в функцию оболочки”

Для лучшего решения есть два элемента:

  • shift
  • (более) цитирование

Определите функцию с помощью shift , например:

 function build { local cc="$1" local cflags="$2" shift 2 make CC="$cc" CFLAGS="$cflags" "$@" } 

где мы сохраняем первые два параметра для локальных переменных, а затем сдвигаем весь массив аргументов на два; Кроме того, укажите расширение «$ @».

Затем назовите его дополнительным предложением, например:

 build gcc "XXX" 'VAR1="ab" VAR2="c=A d=B"' 'LDFLAGS="-L/opt/lib -lm"' 

где одиночные кавычки защищают дополнительные аргументы в функции; в противном случае оболочка удаляет кавычки, и вы VAR2=c=A d=B с VAR2=c=A d=B (без кавычек) в функции.

  • Команда Grep в сценарии оболочки
  • Как передать значение, которое должно быть в кавычках для команды?
  • Как создать список элементов под определенными заголовками в текстовом документе? (Linux / Bash)
  • Измените файл SVG на основе информации в файле CSV
  • Передавать команды сценарию, который ждет ввода на машине Linux
  • Ссылка на переменные массива bash из другого массива
  • Удалите строку, используя определенные значения (-)
  • Итерация через подкаталоги и выполнение awk-скрипта для определенных файлов
  • Как убить процесс в скрипте оболочки, который работает через cron?
  • shell-скрипты все еще работают без #! (строка sha-bang)
  • Скрипт для su-c на экран не работает как предполагалось
  • Linux и Unix - лучшая ОС в мире.