Скрипт bash передает переменную команде ./configure, содержащей кавычки и расширение - PullRequest
0 голосов
/ 11 мая 2018

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

myvars.cfg

myFolderA="/home/myPrefix"
myFolderB="/home/stuffB"
myFolderC="/home/stuffC"
optsA="--prefix=${myFolderA}"
optsB="CPPFLAGS=\"-I${myFolderB} -I${myFolderC}\""
cmd="/home/prog/"

myScript.sh

#!/bin/bash
. /home/myvars.cfg
doCmd=("$cmd/configure" "${optsA}" "${optsB}")
${doCmd[@]}

doCmd должно выглядеть следующим образом

/home/prog/configure --prefix=/home/myPrefix CPPFLAGS="-I/home/stuffB -I/home/stuffC"

, однако, при запуске bash он добавляет одинарные кавычки

 /home/prog/configure --prefix=/home/myPrefix 'CPPFLAGS="-I/home/stuffB' '-I/home/stuffC"'

, вызывая ошибку

configure: error: unrecognized option: `-I/home/stuffC"'

Есть ли способ передать переменную, которая должна быть расширена top и содержит двойные кавычки?

1 Ответ

0 голосов
/ 11 мая 2018

Поскольку ваш скрипт написан, нет смысла использовать массив doCmd.Вы можете просто написать команду:

"$cmd/configure" "${optsA}" "${optsB}"

Или, проще:

"$cmd/configure" "$optsA" "$optsB"

Однако возможно, что вы упростили сценарий таким образом, что скрывается необходимостьмассив.В любом случае, если вы используете массив, вам нужно убедиться, что его элементы не разделены по словам и не расширены filepath, поэтому вы должны указать его расширение:

"${doCmd[@]}"

Кроме того, вам нужно избавиться отцитаты в optsB.Вы не хотите передавать

CPPFLAGS="-I/home/stuffB -I/home/stuffC"

в сценарий configure.Вы хотите передать то, что пропустит оболочка, если вы наберете приведенную выше строку.И то, что оболочка передаст, будет единственным аргументом командной строки с пробелом в нем, похожим на это:

CPPFLAGS=-I/home/stuffB -I/home/stuffC

Чтобы передать это в optsB, вы просто пишете:

optsB="CPPFLAGS=-I${myFolderB} -I${myFolderC}"

Наконец, оболочка не «добавляет одинарные кавычки» в командную строку.Он показывает вам форму команды, которую вы можете ввести в командной строке.Поскольку аргумент (неверно) содержит символ кавычки, оболочка показывает вам команду с аргументами skingle-quote, так что вы можете видеть, что optB был (неправильно) разделен на два аргумента, каждый из которых содержит (неправильно) одиндвойная кавычка.

Вы могли бы найти многое из вышеперечисленного и многое другое, вставив свой скрипт в https://shellcheck.net. Как подсказывает сводка тегов bash , вы всегда должны попробовать это, прежде чем спрашиватьвопрос оболочки здесь, потому что большую часть времени, он решит вашу проблему мгновенно.

...