参照ファイルからトークンを抽出する

参照ファイルからトークンを抽出する

スクリプトを作成していますが、参照ファイルからサーバー名とポートの詳細を取得する必要があるスクリプト部分があります。

詳細を取得するために次のロジックを使用しましたが、より良いオプションを探しています。アドバイスしてください。

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)1行を無駄にせずにb)句をインデントすると、thenif / 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))。

関連情報