Я пишу сценарий, есть раздел, в котором сценарий должен получить имя сервера и сведения о порте из справочного файла.
Я использовал приведенную ниже логику, чтобы получить подробную информацию, но ищу лучший вариант. Пожалуйста, порекомендуйте.
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
Вам не нужно передавать grep в awk. попробуй это:
HOST="$(awk -F= '/SERVER_NAME/ {print $2}' $HOME/env.ref)"
PORT="$(awk -F= '/SERVER_PORT/ {print $2}' $HOME/env.ref)"
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 или чем-то еще... но это невозможно узнать без описания или большого скрипта образец.
Предполагая, что формат этого файла составляет 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
)).