スクリプトを作成していますが、参照ファイルからサーバー名とポートの詳細を取得する必要があるスクリプト部分があります。
詳細を取得するために次のロジックを使用しましたが、より良いオプションを探しています。アドバイスしてください。
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)1行を無駄にせずにb)句をインデントすると、
then
if / then / elseが読みやすくなります。また、{...}
あいまいさがない限り、周辺変数を使用する必要はありません。たとえば、$HOSTPORT
$ HOSTPORTという単一の変数があり、${HOST}${PORT}
2つの変数が互いに何もなしに連結されています。最後に、あなたは$
忘れてしまいました$PORT
。if [ "$HOST" -a "$PORT" ] ; then echo "Details extracted" else echo "Details not found" fi
あなたが望むものが見つかったものと見つからないものをエコーすることであれば、1行にすることができます。
[ "$HOST" -a "$PORT" ] && echo "Details extracted" || echo "Details not found"
スクリプトには改善できる部分はあまりありません。十分ではありません。スクリプトの残りの部分が何をしているかに応じて、内容全体をawk、Perl、Pythonなどで書く方が良いかもしれませんが、説明や大きなスクリプトの例がなければわかりません。
答え2
ファイル形式が行である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
))。