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
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