Linux

shell 입력 값 검증하기

보리콩 2023. 3. 20. 15:28

회사에서 특정 모듈을 실행하는 쉘 스크립트를 작성하게 되었다. 해당 모듈에는 다양한 기능이 포함되어 있고 각각의 기능들을 입력받은 parameter 값에 따라 실행하도록 코드를 분리해두었다. 그러다 보니 모듈 실행 시 입력해야 하는 인자값이 많게는 4개가 넘어가게 되었다.

 

이렇게 입력 값이 너무 많은데 인자 값을 잘못 입력해도 쉘에선 아무런 검증을 하지 않다보니 사용자는 값을 제대로 입력했는지 알기가 어렵다. 또 입력 값의 순서나 어떤 값을 어떤 형태로 입력해야 하는지도 너무 복잡했다. 해당 쉘을 사용하는 가이드 문서를 작성하기는 했지만 매번 쉘을 실행할 때마다 가이드를 찾아서 읽어야 한다면 너무 비효율적일 것이다.

 

팀장님께서 해당 문제에 대해 조언을 해주셔서 쉘에 쉘 사용법과 입력 값 검증에 대한 부분을 다음과 같이 추가했다.

#!/usr/bin/sh
##############################################################################
# Ver 1.0 : 2023.03.13
# 상세 가이드 : 가이드 url
##############################################################################

Usage( )
{
    echo "  USAGE   : test.sh [param1] [param2]"
    echo "  - param1  : 첫번째 parameter [$(IFS='|'; echo "${PARAMS[*]}")]"
    echo "  - param2  : 두 번째 parameter
    echo ""
}

#######################
# 1. 디렉토리 이동
cd 쉘경로

#######################
# 2. 입력 값
PARAMS=(A B C D)
PARAM1=$1
PARAM2=$2

#######################
# 3. 입력 값 검증
if [[ " ${PARAMS[*]} " != *" $PARAM1 "* ]]; then
  echo "잘못된 입력입니다."
  Usage
  exit 2
elif [ -z "$PARAM2" ]; then
  echo "두번째 parameter를 입력해주세요."
  Usage
  exit 2
fi

echo "module 즉시 실행"
sh module.sh $PARAM1 $PARAM2

#######################

 

회사 코드이기 때문에 적당히 생략해서 작성하였다.

 

코드를 하나씩 자세히 보면 다음과 같다.

Usage( )
{
    echo "  USAGE   : test.sh [param1] [param2]"
    echo "  - param1  : 첫번째 parameter [$(IFS='|'; echo "${PARAMS[*]}")]"
    echo "  - param2  : 두 번째 parameter
    echo ""
}

Usage 함수는 잘못된 값이 입력되거나 값이 입력되지 않았을 경우 해당 쉘에 입력 값에 대한 가이드를 출력하는 함수이다. 

아래는 출력 예시이다.

  USAGE   : test.sh [param1] [param1]
  - param1  : 첫번째 parameter [A|B|C|D]
  - param2  : 두번째 parameter

 

다음은 변수 선언을 하는 코드이다.

# 2. 입력 값
PARAMS=(A B C D)
PARAM1=$1
PARAM2=$2

PARAMS는 PARAM1 변수가 가져야 하는 값을 저장하는 변수이고  PARAM1, PARAM2는 첫번쩨, 두번째 입력값을 저장하는 변수이다. 굳이 따로 선언할 필요는 없지만 코드의 가독성을 위해 추가하였다.

 

입력 값을 검증하는 코드이다.

# 3. 입력 값 검증
if [[ " ${PARAMS[*]} " != *" $PARAM1 "* ]]; then
  echo "잘못된 입력입니다."
  Usage
  exit 2
elif [ -z "$PARAM2" ]; then
  echo "두번째 parameter를 입력해주세요."
  Usage
  exit 2
fi

PARAM1값이 PARAMS 배열에 존재하는지 판단한다. 없다면 Usage 함수를 호출해 사용법을 출력한다.

PARAM2 같은 경우는 간단하게 값이 입력되었는지 검증하게 했다. 입력 값 검증 부분은 각 쉘 별로 필요한 조건문을 작성해 추가하면 될 것 같다.

 

이렇게 모든 입력 값에 대한 검증이 끝나면 마지막으로 해당 쉘을 실행하게 된다. 

쉘 스크립트는 처음 작성해봤는데 사용자의 입장에서 직관적으로 사용법을 알 수 있도록 가이드를 잘 만드는 것이 중요하다는 것을 알게 되었다.