Extraindo tokens de um arquivo de referência

0

Estou escrevendo um script, há uma seção onde o script precisa buscar o nome do servidor e detalhes da porta de um arquivo de referência.

Eu usei a lógica abaixo para buscar os detalhes, mas estou procurando uma opção melhor. Por favor, informe.

HOST=$(grep SERVER_NAME $HOME/env.ref | awk -F '=' '{print $2}')
PORT=$(grep SERVER_PORT $HOME/env.ref | awk -F '=' '{print $2}')

if [ "${HOST}" -a "{PORT}" ]
then
echo "Details extracted"
else
echo "Details not found"
fi
    
por Amit Baid 25.07.2017 / 12:44

2 respostas

0

  1. Você não precisa canalizar o grep para o awk. tente isso:

    HOST="$(awk -F= '/SERVER_NAME/ {print $2}' $HOME/env.ref)"
    PORT="$(awk -F= '/SERVER_PORT/ {print $2}' $HOME/env.ref)"
    
  2. if / then / else é mais legível se você a) não desperdiçar uma linha em then eb) indentar as cláusulas. Além disso, você não precisa usar {...} em torno de variáveis, a menos que haja uma possibilidade de ambigüidade. por exemplo. $HOSTPORT é uma única variável chamada $ HOSTPORT, enquanto ${HOST}${PORT} é duas variáveis concatenadas sem nada entre elas. Finalmente, você esqueceu o $ on $PORT .

    if [ "$HOST" -a "$PORT" ] ; then 
      echo "Details extracted"
    else
      echo "Details not found"
    fi
    

    E se tudo o que você vai fazer é apenas encontrar ou não ser encontrado, isso pode ser feito em uma linha:

    [ "$HOST" -a "$PORT" ] && echo "Details extracted" || echo "Details not found"
    

Não há muito mais em seu script que possa ser melhorado muito. Simplesmente não há o suficiente lá. Dependendo de exatamente o que o resto do seu script está fazendo, pode ser melhor escrever a coisa toda em awk ou perl ou python ou algo assim ... mas é impossível saber sem uma descrição ou um script grande amostra.

    
por 25.07.2017 / 13:31
0

Supondo que o formato desse arquivo seja name=value lines, você poderia fazer isso no shell simples ( bash ou zsh ):

while read -r line; do 
    case "$line" in 
        SERVER_NAME=*|SERVER_PORT=*) declare "$line";; 
    esac
done < env.ref
echo "$SERVER_NAME"
echo "$SERVER_PORT"

Isso lê o arquivo, e quando as linhas especificadas são encontradas, use o declare builtin para criar as variáveis neste shell atual (embora quando chamado dentro de uma função, note que restringiria o escopo dessa variável para aquela função (a menos que você use declare -g )).

    
por 25.07.2017 / 14:06