从参考文件中提取令牌

从参考文件中提取令牌

我正在编写一个脚本,有一个部分脚本需要从参考文件中获取服务器名称和端口详细信息。

我已使用以下逻辑来获取详细信息,但是我正在寻找更好的选择。请指教。

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

答案1

  1. 您不需要将 grep 通过管道传输到 awk 中。尝试这个:

    HOST="$(awk -F= '/SERVER_NAME/ {print $2}' $HOME/env.ref)"
    PORT="$(awk -F= '/SERVER_PORT/ {print $2}' $HOME/env.ref)"
    
  2. 如果你 a) 不要浪费一行then并且 b) 缩进子句,那么 if/then/else 会更具可读性。另外,{...}除非可能存在歧义,否则不需要使用周围变量。例如$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 或其他东西编写整个内容......但如果没有描述或大型脚本示例,就不可能知道。

答案2

假设该文件的格式是name=value行,您可以在普通 shell 中执行此操作(bashzsh):

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在当前 shell 中创建变量(尽管在函数内部调用时,请注意,它将将该变量的范围限制为该函数(除非您使用declare -g))。

相关内容