참조 파일에서 토큰 추출

참조 파일에서 토큰 추출

스크립트를 작성 중인데 참조 파일에서 서버 이름과 포트 세부 정보를 가져와야 하는 스크립트 부분이 있습니다.

세부 정보를 얻기 위해 다음 논리를 사용했지만 더 나은 옵션을 찾고 있습니다. 조언해주세요.

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) 한 줄을 낭비하지 않고 b) 절을 들여쓰면 thenif/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행이라고 가정하면 일반 셸( 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)).

관련 정보