我正在编写一个脚本,有一个部分脚本需要从参考文件中获取服务器名称和端口详细信息。
我已使用以下逻辑来获取详细信息,但是我正在寻找更好的选择。请指教。
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
您不需要将 grep 通过管道传输到 awk 中。尝试这个:
HOST="$(awk -F= '/SERVER_NAME/ {print $2}' $HOME/env.ref)" PORT="$(awk -F= '/SERVER_PORT/ {print $2}' $HOME/env.ref)"
如果你 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 中执行此操作(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
的在当前 shell 中创建变量(尽管在函数内部调用时,请注意,它将将该变量的范围限制为该函数(除非您使用declare -g
))。