переменная обновления bash с именем переменной с текстом [duplicate]

Решение этой проблемы постоянно меняется с течением времени, когда Unity и Android SDK меняются.

Обратите внимание, что его проблема, по-видимому, исправлена ​​в Unity 2017.1.

ПОСЛЕДНЕЕ РЕШЕНИЕ

1) Для Windows загрузите "tools_r25.2.3-windows.zip" и разархивируйте его.

2) Для MacOSX загрузите "tools_r25. 2.3-macosx.zip " и разархивируйте его.

3) Добавьте путь распакованного SDK к настройкам Edit -> ] ---> Внешние инструменты ---> SDK box.

STILL NOT WORKING?

Удалить SDK Tools 25 и Android SDK Tools 26. Удалить как SDK Platform-Tools, так и SDK Tools. Используйте номер версии ниже.

OLD SOLUTION:

Вы не правильно настроили SDK .

Для настройки Android SDK выполните следующие действия.

1. Убедитесь, что в SDKpath нет пробелов. Поэтому создайте папку с именем AndroidSDK в каталоге C.

2. Скопируйте папку Android-sdk в каталог C:/AndroidSDK.

Теперь ваш путь к SDK должен выглядеть так:

C:/AndroidSDK/Android-sdk

3. Обновите свой Android SDK-путь в редакторе Unity.

Теперь проверьте, работает ли это, пытаясь снова создать для Android.

Если это не удается, продолжайте снизу

4. Загрузите последнюю версию Unity.

5. Перезагрузите SDK , затем скопируйте файл в C:/AndroidSDK/Android-sdk.

6. Вернитесь в Unity и обновите путь

7. Создайте проект для Android еще раз, он покажет ошибку и попросит вас обновить SDK.

Нажмите кнопку «Обновить Android SDK». Unity автоматически обновит ваш SDK. Затем ваш SDK должен выглядеть как-то внизу. Ваша проблема должна быть удалена.

27
задан Charles 3 September 2013 в 19:26
поделиться

7 ответов

Главное, что рекомендуемый способ сделать это:

eval "$var=\$val"

с помощью RHS также косвенно. Поскольку eval используется в одной и той же среде, он будет иметь $val, поэтому его отсрочка будет работать, и теперь это всего лишь переменная. Поскольку переменная $val имеет известное имя, нет никаких проблем с цитированием, и она могла бы быть даже записана как:

eval $var=\$val

Но поскольку лучше всегда добавлять кавычки, первое лучше , или даже это:

eval "$var=\"\$val\""

Лучшая альтернатива в bash, которая была упомянута для всего, что полностью исключает eval (и не так тонко, как declare и т. д.):

printf -v "$var" "%s" "$val"

Хотя это не прямой ответ на то, что я изначально спросил ...

4
ответ дан Eli Barzilay 18 August 2018 в 02:11
поделиться

Несколько лучше, избегая возможных последствий для использования с помощью eval, является

declare $var="$val"

. Обратите внимание, что declare является синонимом typeset в bash. Команда typeset более широко поддерживается (ksh и zsh также используют ее):

typeset $var="$val"
24
ответ дан chepner 18 August 2018 в 02:11
поделиться
  • 1
    Это выглядит не переносимым для оболочек меньше, чем bash – MarcH 16 September 2014 в 16:51
  • 2
    В самом деле; в то время как declare является расширением стандарта POSIX, он также является синонимом typeset, который является , поддерживаемый другими основными оболочками (ksh и zsh, а именно). Корпуса, которые не поддерживают что-то подобное, должны осторожно использовать eval. – chepner 16 September 2014 в 16:55
  • 3
    eval "$var='$val'" не является достаточно осторожным: если содержимое содержит буквенные одиночные кавычки, они могут легко убежать. – Charles Duffy 14 April 2015 в 01:36
  • 4
  • 5

Более новые версии bash поддерживают что-то, называемое «преобразование параметров», задокументированное в одном и том же имени в bash (1).

"${value@Q}" расширяется до версии с кодами "${value}" что вы можете повторно использовать в качестве входа.

Это означает, что следующее безопасное решение:

eval="${varname}=${value@Q}"
0
ответ дан Darren Embry 18 August 2018 в 02:11
поделиться

У Bash есть расширение до printf, которое сохраняет свой результат в переменной:

printf -v "${VARNAME}" '%s' "${VALUE}"

Это предотвращает все возможные проблемы экранирования.

Если вы используете недопустимый идентификатор для $VARNAME команда выйдет из строя и вернет код состояния 2:

$ printf -v ';;;' foobar; echo $?
bash: printf: `;;;': not a valid identifier
2
16
ответ дан David Foerster 18 August 2018 в 02:11
поделиться
eval "$var=\$val"

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

Когда аргумент eval расширяется оболочкой, $var заменяется на имя переменной и \$ заменяется простым долларом. Следовательно, строка, которая оценивается, становится:

varname=$value

Это именно то, что вы хотите.

Обычно все выражения формы $varname должны быть заключены в двойные кавычки. Есть только два места, где кавычки могут быть опущены: переменные назначения и case. Поскольку это назначение переменной, здесь не нужны кавычки. Тем не менее, они не пострадали, поэтому вы могли бы также написать исходный код:

eval "$var=\"the value is $val\""
15
ответ дан Roland Illig 18 August 2018 в 02:11
поделиться
  • 1
    Косвенность на RHS - это не то, что я ищу. – Eli Barzilay 30 March 2012 в 13:42
  • 2
    ( лоб-пощечина ). Ба, я полностью пропустил, почему я do хочет косвенную привязку к RHS. Поскольку ваш ответ вообще не говорит об этом, я сейчас отредактирую его, вместо того, чтобы делать ответ «сам-и-пат-мой-собственный-обратно» ... – Eli Barzilay 30 March 2012 в 14:28
  • 3
    Фантастика! Раньше я делал какую-то сложную ерунду eval eval export. Спасибо Вам большое. Для googlers, перейдите с ответом выше, а не eval eval export format. – bgStack15 9 February 2016 в 21:57
  • 4
    Если кто-то был смущен приведенной выше формулировкой, возможно, eval "$var"='$val' делает ее более ясной. Или, может быть, менее ясны, но теперь у вас есть два фразнга, которые следует учитывать и сравнивать, чтобы убедиться, что вы поняли. :-) – clacke 2 February 2018 в 09:24
  • 5
    @Eli Нет ничего плохого в ответе на свой вопрос. Я вернул ваше редактирование, так как оно не соответствовало моему стилю ответа. – Roland Illig 2 February 2018 в 18:51
0
ответ дан forbidder 6 September 2018 в 17:21
поделиться
0
ответ дан forbidder 29 October 2018 в 23:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: