BASH Função verificador de variáveis

1

Estou lutando para descobrir uma maneira de reduzir a duplicação de código. Especificamente ao verificar se uma variável está definida. Meu código atualmente é assim:

# webadmin enabled
if [ -f "${servercfgfullpath}" ]; then
    webadminenabled=$(grep "ControlPanelEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"")
    if [ ! -n "${webadminenabled}" ]; then
        webadminenabled="NOT SET"
    fi
else
    webadminenabled="\e[0;31mUNAVAILABLE\e[0m"
fi

# webadmin port
if [ -f "${servercfgfullpath}" ]; then
    webadminport=$(grep "ControlPanelPort" "${servercfgfullpath}" | tr -cd '[:digit:]')
fi
if [ ! -n "${webadminport}" ]; then
    webadminport="0"
fi

No verão, o código primeiro verifica se um arquivo de configuração está disponível, se não exibir "UNAVAILABLE" para o usuário. Se o arquivo de configuração estiver disponível, ele tentará obter informações específicas do arquivo de configuração para o usuário, caso isso falhe, ele exibirá "NOT SET".

Não é realmente um problema se usado apenas algumas vezes, no entanto, isso é duplicado muitas vezes e, embora funcione, está longe de ser ideal, pois fica muito difícil de ler.

variável serverconfigpath Eu acredito que é fácil o suficiente para melhorar no entanto eu gostaria de criar uma função ou uma maneira de simplesmente definir uma variável para "NOT SET" se a variável não conseguir obter as informações necessárias.

Alguma idéia ou ponte sobre como simplificar esse código?

Aqui está o arquivo específico com o código incorreto link

    
por dgibbs 24.04.2016 / 21:58

1 resposta

3

As atribuições de variáveis podem ser simplificadas da seguinte forma:

if [ ! -n "${varname}" ]; then
    varname="some default"
fi

é equivalente a

varname=${varname:-"some default"}

e, ainda mais conciso,

: ${varname:="some default"}

Para parametrizar isso para nomes de variáveis arbitrárias e valores padrão, sugiro definir uma função. bash insiste em um nome de variável explícito para substituição de parâmetro com ${...} , portanto, especificar uma variável ou comando indireto em vez de varname não parece possível (para mim):

#!/bin/bash

# exec_with_default
# Assign command output to specified variable, or assign default value if
# output empty
#
# $1 : command
# $2 : variable to be set
# $3 : default value for variable

function exec_with_default {
    local t="$($1)"    # Assign command output to temporary variable t
    : ${t:="$3"}       # Perform bash parameter subsitution on t
    eval "$2=\$t"      # Indirectly assign t to variable name provided in $3
}

exec_with_default "echo something" "varname" "not set"
echo $varname

exec_with_default "echo" "varname" "not set"
echo $varname
    
por 24.04.2016 / 22:57