Извлечение токенов из справочного файла

Я пишу сценарий, есть раздел, в котором сценарий должен получить имя сервера и сведения о порте из справочного файла.

Я использовал приведенную ниже логику, чтобы получить подробную информацию, но ищу лучший вариант. Пожалуйста, порекомендуйте.

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
0
25.07.2017, 14:00
2 ответа
  1. Вам не нужно передавать grep в awk. попробуй это:

    HOST="$(awk -F= '/SERVER_NAME/ {print $2}' $HOME/env.ref)"
    PORT="$(awk -F= '/SERVER_PORT/ {print $2}' $HOME/env.ref)"
    
  2. if/then/else будет более читабельным, если вы a )не тратите впустую строку на thenи b )делаете отступы в предложениях. Кроме того, вам не нужно использовать {...}вокруг переменных, если нет возможности двусмысленности. например. $HOSTPORT— это одна переменная с именем $HOSTPORT, а ${HOST}${PORT}— это две конкатенированные переменные, между которыми ничего нет. Наконец, вы забыли $на $PORT.

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

    И если все, что вы собираетесь сделать, это просто найти или не найти эхо, это можно сделать в одной строке:

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

В вашем сценарии мало что можно было бы значительно улучшить. Там просто не хватает. В зависимости от того, что именно делает остальная часть вашего скрипта, может быть лучше написать все это на awk, perl, python или чем-то еще... но это невозможно узнать без описания или большого скрипта образец.

0
28.01.2020, 04:43

Предполагая, что формат этого файла составляет name=valueстрок, вы можете сделать это в простой оболочке(bashили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"

Это читает файл, и когда указанные строки найдены, используйте встроенную declareдля создания переменных в этой текущей оболочке (, хотя при вызове внутри функции обратите внимание, что она будет ограничьте область действия этой переменной этой функцией (, если только вы не используетеdeclare -g)).

0
28.01.2020, 04:43

Теги

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