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 (или в конце этой функции). Переменные устанавливаются в том порядке, в котором они отображаются в файле.

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

  • Как я могу отсортировать этот массив чисел?
  • Как определить, успешно ли выполнена команда, выполненная `exec`?
  • Функция «pathmunge» для произвольных «PATH» -подобных переменных
  • Прерывание бесконечного цикла while с чтением
  • Ошибка: команда не найдена
  • Как экспортировать переменные, которые установлены, все сразу?
  • Почему значение BASH_SUBSHELL не изменяется при изменении значения SHLVL?
  • bash добавить путь для обработки некоторых файлов
  • Привязать ключ к сценарию bash
  • Проверка числа с десятичной запятой
  • Сценарий Bash для перебора файлов
  • Linux и Unix - лучшая ОС в мире.