Пробелы в памяти при замене одной переменной bash на другую - PullRequest
1 голос
/ 23 июня 2010

У меня проблемы с сохранением пробелов в скрипте bash:

CURRENT_YEAR=$(date "+%Y")
MESSAGE=$(eval echo "$(/usr/libexec/PlistBuddy -c "Print NSHumanReadableCopyright" Info.plist)")

/usr/libexec/PlistBuddy -c "Set NSHumanReadableCopyright $MESSAGE" ${CONFIGURATION_BUILD_DIR}/${INFOPLIST_PATH}

Соответствующий раздел Info.plist:

<NSHumanReadableCopyright>Copyright © BEC, ${CURRENT_YEAR}\nAll rights reserved.</NSHumanReadableCopyright>

Скрипт считывает значение из списка, затем подставляет другую переменную (CURRENT_YEAR) в значение, которое было прочитано из списка.

Проблема в том, что новая строка в MESSAGE вызывает проблемы. Если я использую \n, вместо новой строки отображается 'n'. Если используется символ новой строки, то команда не выполняется, потому что «Все» интерпретируется как новая команда.

Как мне выйти из новой строки? Есть лучший способ сделать это? У меня очень мало баш-фу.

Обновление - Решение:

Спасибо за помощь. Решением было сойти с ума от кавычек. Вот готовый результат:

CURRENT_YEAR="$(date "+%Y")"
MESSAGE_TEMPLATE="$(/usr/libexec/PlistBuddy -c "Print NSHumanReadableCopyright" Info.plist)"
MESSAGE=$(eval echo '"'"$MESSAGE_TEMPLATE"'"')
/usr/libexec/PlistBuddy -c "Set NSHumanReadableCopyright $MESSAGE"  ${CONFIGURATION_BUILD_DIR}/${INFOPLIST_PATH}

Ответы [ 3 ]

1 голос
/ 23 июня 2010

Вы должны получить двойные кавычки вокруг строки, являющейся eval 'ed (поэтому она заменит выражение ${}, но не будет рассматривать символ новой строки как разделитель между командами).Это довольно сложно, так как нет чистого способа поместить двойные кавычки в двойные кавычки;но вы можете сделать это, поместив двойные кавычки в одинарных кавычках вокруг строки в двойных кавычках (о, и тогда я всегда помещаю двойные кавычки вокруг всего этого, даже если я не знаю, что это действительно необходимо):

CURRENT_YEAR=$(date "+%Y")
MESSAGE="$(eval echo '"'"$(/usr/libexec/PlistBuddy -c "Print NSHumanReadableCopyright" Info.plist)"'"')"

(Если у вас возникли проблемы с синтаксическим анализом, '"' - двойная кавычка (защищенная одинарными кавычками, чтобы предотвратить ее оценку до тех пор, пока eval не получит ее), "$(...)" - эторезультат PlistBuddy (защищенный двойными кавычками), а затем '"' - еще одна защищенная двойная кавычка.

После этого я думаю, что ваша команда PlistBuddy Set будет работать нормально, но мне пришлось заключить ее значения в кавычкираньше, так что на всякий случай:

/usr/libexec/PlistBuddy -c "Set NSHumanReadableCopyright '${MESSAGE//\'/\'}'" ${CONFIGURATION_BUILD_DIR}/${INFOPLIST_PATH}

(то, что делает, это помещает одинарные кавычки вокруг $ MESSAGE после экранирования любых встроенных одинарных кавычек.)

1 голос
/ 23 июня 2010

Я не вижу, что PlistBuddy делает достаточно хорошо, чтобы понять, в этом ли проблема, но ваш код пахнет:

CURRENT_YEAR=$(date "+%Y")
MESSAGE=$(eval echo ...)

должно быть

CURRENT_YEAR="$(date "+%Y")"
MESSAGE="$(eval echo ...)"

(Обратите внимание на дополнительные двойные кавычки вокруг $(...). )

Если повезет, это решит проблему, и вы можете просто добавить неэкранированные символы новой строки в ваш файл, не получая All, интерпретируемый как команда,В противном случае это может быть проблема PlistBuddy.

0 голосов
/ 23 июня 2010

Попробуйте добавить это сразу после строки MESSAGE=$(eval echo...:

printf -v MESSAGE "%q" "$MESSAGE"

Это будет хранить значение $MESSAGE обратно в себя с такими символами, как \ escape.

...