Bash: замените переменную, определенную наверху сценария

Личинка ext2 модуль также понимает ext3 и ext4, поскольку различия минимальны. Сам модуль встроен в личинку core.img файл (при использовании расширения [234] для начальной загрузки/), который обычно копируется в секторы после главной загрузочной записи перед любыми разделами, запускается, и код в главной загрузочной записи просто загружает те последующие секторы.

2
24.01.2014, 08:25
3 ответа

Обертывания значения переменной с двойными кавычками недостаточно для защиты любых вложенных имен переменной. Таким образом, то, что происходит, Вы устанавливаете $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 команда имеет плохого представителя So, я думаю, что поощрил бы Вас делать то, что Вы пытаетесь использовать функции вместо этого.

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

Я испытал бы желание создать функцию, что Вы передаете в нее параметры, и функция возвратилась бы созданный $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
3
27.01.2020, 22:00
  • 1
    Ничего себе, спасибо за этот ответ. У меня будет хорошее чтение этого позже, чтобы удостовериться, что я понимаю этот :D –  dgibbs 24.01.2014, 14:37

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

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)
}
1
27.01.2020, 22:00
  • 1
    Это действительно работает хорошо. Однако я надеюсь, что, если это возможно, существует другая опция. Спасибо за Вашу справку –  dgibbs 24.01.2014, 01:14

Необходимо установить детские коляски после того, как fn_autoip будет выполнен (или в конце той функции). Переменные установлены в порядке, который они разоблачают в файле.

Вы 'перезагружаете' переменную путем установки его снова.

0
27.01.2020, 22:00

Теги

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