Bash: изменить переменную, определенную в верхней части скрипта

В верхней части моего скрипта у меня есть некоторые переменные, определенные так

# Start Variables defaultmap="de_dust2" port="27015" sourcetvport="27020" clientport="27005" maxplayers="16" ip="0.0.0.0" parms="-game csgo -usercon +map ${defaultmap} -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -maxplayers ${maxplayers}" 

У меня есть функция fn_ autoip которая предназначена для изменения ${ip} если она установлена ​​на 0.0.0.0 для IP-карты сети (что-то вроде 192.168.1.2). Однако это не меняется.

Я предполагаю, что он не меняет ${ip} потому что он находится внутри другой переменной ${parms} которая уже была определена, когда ${ip} была 0.0.0.0 . Вот как это выполняется:

 fn_debugserver(){ fn_autoip ${executable} ${parms} } 

Есть ли способ, с помощью которого ${parms} можно «перезагрузить» новым ${ip} из fn_autoip ?

Это из моего проекта на GitHub

3 Solutions collect form web for “Bash: изменить переменную, определенную в верхней части скрипта”

Обертывание значения переменной с двойными кавычками недостаточно для защиты любых вложенных имен переменных. Итак, что происходит, вы устанавливаете $params , но когда ваша программа выполняется, $params имеет эти переменные, поэтому они исчезают, когда вы позже оцениваете $params .

пример

Скажем, у нас есть такая ситуация, похожая на вашу.

 $ nested_var="nested secret" $ params="the value is: ${nested_var}" 

Когда мы оцениваем эти переменные:

 $ echo $nested_var nested secret $ echo $params the value is: nested secret 

Таким образом, мы видим, что переменная в определении $params уже расширена, поэтому она больше не находится в форме $nested_var , теперь она netsted_secret .

Использование одинарных кавычек поможет защитить определение $params .

 $ params='the value is: $nested_var' $ echo $params the value is: $nested_var 

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

 $ nested_var="nested secret" $ eval "echo $params" the value is: nested secret 

Изменение $nested_var :

 $ nested_var="another nested secret" $ eval "echo $params" the value is: another nested secret 

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

Альтернативный метод

У меня возникнет соблазн создать функцию, в которую вы передадите ей параметры, и функция вернет построенные строки $params обратно.

пример

 $ genparam () { printf -- "-game csgo -usercon +map %s -strictportbind -ip %s -port %s +clientport %s +tv_port %s -maxplayers %s\n" "$1" "$2" "$3" "$4" "$5" "$6"; } 

Вот расширенный вид этого однострочного слоя:

 $ genparam () { printf -- "-game csgo -usercon +map %s -strictportbind -ip %s -port %s +clientport %s +tv_port %s -maxplayers %s\n" \ "$1" "$2" "$3" "$4" "$5" "$6"; \ } 

Теперь, когда мы вызываем нашу функцию genparm() мы передаем ей аргументы, которые мы хотим использовать так:

 $ genparam $defaultmap $ip $port $clientport $sourcetvport $maxplayers -game csgo -usercon +map de_dust2 -strictportbind -ip 0.0.0.0 -port 27015 +clientport 27005 +tv_port 27020 -maxplayers 16 

Вероятно, это не лучшее решение, но вы можете превратить переменную в функцию и использовать ее так

 parms () { echo "-game csgo -usercon +map ${defaultmap} -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -maxplayers ${maxplayers}" } #... fn_debugserver() { fn_autoip $executable $(params) } 

Вам нужно установить parms после запуска fn_autoip (или в конце этой функции). Переменные устанавливаются в том порядке, в котором они отображаются в файле.

Вы перезагрузите эту переменную, установив ее снова.

  • Что означают квадратные скобки без «если» слева?
  • Как написать сценарий bash для сообщения состояний машины и условного ping их?
  • Почему set-o errexit нарушает это выражение read / heredoc?
  • grep из текстового файла с разделителями и включить его в другую команду
  • Создание папок для определенных элементов в таблице
  • Как сравнить две строки в двух отдельных файлах?
  • Ошибка скрипта Bash: ожидается целочисленное выражение
  • Почему параметры Bash `command` и` type` являются необязательными?
  • Итерация через аргументы командной строки в Bash
  • Использование `;` в составных командах
  • Хотите извлечь часть имени файла до 5-го _?
  • Является ли оболочка созданной `bash -i -c <command>` интерактивной?
  • Interesting Posts

    Общий HTTP-сервер, который просто сбрасывает запросы POST?

    Длительный процесс труб в буфер обмена на mac

    печать на «Один единственный сервер CUPS» не может найти очереди, если «ServerName» является CNAME

    bath control, если используется флаг опции

    Unix – поиск имен с egrep

    Сервер Cygwin XWin: как отключить создание окна «панель»?

    распаковывая рекурсивно все файлы xlsx в новый каталог, содержащий имя исходного файла

    Сценарий запуска systemd postgresql

    «Запрос на распределение PTY не удалось на канале 0 stdin: не является tty», когда SSH'ing на сервер Debian

    Ошибки внутреннего сервера с CUPS

    Получить каталог, из которого был вызван скрипт

    Есть ли гарантия, что / usr / bin / env будет существовать?

    Мое ядро ​​SMDK2416 (для s3c2416) работает на 64MRAM, но разбилось на 128M

    Всегда пытайтесь остановить демона при выключении без файла блокировки в / var / lock / subsys /

    Как найти рабочую среду GUI из терминала?

    Linux и Unix - лучшая ОС в мире.