Bash: variável de mudança definida no topo do script

2

No topo do meu script eu tenho algumas variáveis definidas como

# 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}"

Eu tenho uma função fn_ autoip que é projetada para alterar ${ip} se estiver definida como 0.0.0.0 para o IP da placa de rede (algo como 192.168.1.2). No entanto, isso não está mudando isso.

Meu palpite é que não está mudando ${ip} porque está dentro de outra variável ${parms} que já foi definida quando ${ip} foi 0.0.0.0 . É assim que é executado:

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

Existe uma maneira em que ${parms} pode ser "recarregado" com o novo ${ip} de fn_autoip ?

Isso é do meu projeto no GitHub

    
por dgibbs 23.01.2014 / 22:22

3 respostas

3

Não é suficiente envolver o valor de uma variável com aspas duplas para proteger os nomes das variáveis aninhadas. Então, o que está acontecendo é que você está definindo $params , mas quando seu programa é executado, $params está tendo essas variáveis expandidas, então elas desaparecem quando você avalia $params mais tarde.

Exemplo

Digamos que tenhamos essa situação, semelhante à sua.

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

Quando avaliamos essas variáveis:

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

Assim, podemos ver que a variável em $params definition já foi expandida, por isso não está mais no formato $nested_var , agora é netsted_secret .

O uso de aspas simples ajudaria a proteger $params definition.

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

Mas agora a questão é como dizer ao Bash para expandir essa variável, mais tarde. Aqui é onde você poderia usar o comando eval .

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

Alterando $nested_var :

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

O comando eval tem um

Método alternativo

Eu ficaria tentado a criar uma função que você passa para os parâmetros, e a função retornaria $params string de volta.

Exemplo

$ 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";  }

Aqui está uma visão expandida do one-liner:

$ 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";    \
}

Agora, quando chamamos nossa função genparm() , passamos os argumentos que queremos que sejam usados da seguinte forma:

$ 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
    
por 24.01.2014 / 12:15
1

Provavelmente não é a melhor solução, mas você pode transformar sua variável em uma função e usá-la assim

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)
}
    
por 23.01.2014 / 22:52
0

Você precisa definir parms após o fn_autoip ser executado (ou no final dessa função). As variáveis são definidas na ordem em que aparecem no arquivo.

Você "recarrega" a variável configurando-a novamente.

    
por 23.01.2014 / 22:37