bash를 사용하여 입력한 값이 목록에 있는지 확인하세요.

bash를 사용하여 입력한 값이 목록에 있는지 확인하세요.

나는 bash 스크립팅에 익숙하지 않습니다. Bash 스크립트에서는 호출할 때 정의된 목록에 대해 프롬프트 값의 유효성을 검사하려고 합니다.

./test.bash [caseyear] [sector]

케이스 연도 및 섹터는 다음 시도 bash 스크립트에서 확인됩니다.

Validating Year
#1 Check the value of the caseyear Parameter
if [ "$1" -eq "$1" 2> /dev/null ]; then
  if [ $1 -ge 2009 ]; then
    export caseyear=$1
  else
    echo -e "\n\tSpecify [caseyear] value greater than or equal to 2009.\n"
    exit 4
  fi
else
  echo -e "\n\tSpecify [caseyear] value greater than or equal to 2009.\n"
  exit 3
fi

입력한 값이 섹터 목록에 있어야 하는지 확인할 수 없어서 다음 스크립트를 시도했습니다.

Validating Sector

#sector list
list_of_sectors="11 40 44_45 52 10_11"

#1 Check if sector value is in the sector list
$ function exists_in_list() {
    LIST=$1
    DELIMITER=$2
    VALUE=$3
    LIST_WHITESPACES=`echo $LIST | tr "$DELIMITER" " "`
    for x in $LIST_WHITESPACES; do
        if [ "$x" = "$VALUE" ]; then
            return 0
        fi
    done
    return 1
}

#2 Check if sector is null
if [ -z "$2" ]; then
    echo -e "\n\tSpecify [caseyear] sector value.\n"
    exit 2
else
  #export omitflag="$(echo $2 | tr '[a-z]' '[A-Z]')" #Convert to upper case
#3 Check if sector value is in the sector list
  export sector

#------------------->Problem Area
#How do I pass the entered $sector value to exists_in_list function that matches with the list, $list_of_sectors?

  if [ $(exists_in_list $list_of_sectors) -ne 0 ] ; then
    echo -e "\n\tSpecify [sector] sector value.\n"
    exit 1
  fi
fi

echo -e "\nYou Specified - CaseYear:$caseyear, Sector:$sector"

감사합니다!

답변1

이는 다음 명령문을 사용하여 가장 쉽게 수행할 수 있습니다 case ... esac.

#!/bin/sh

caseyear=$1
sector=$2

if [ "$#" -ne 2 ]; then
    echo 'expecting two arguments' >&2
    exit 1
fi

if [ "$caseyear" -lt 2009 ]; then
    echo 'caseyear (1st arg) should be 2009 or larger' >&2
    exit 1
fi

case $sector in
    11|40|44_45|52|10_11)
        # do nothing
        ;;
    *)
        # error
        echo 'sector (2nd arg) is not in list' >&2
        exit 1
esac

printf 'Got caseyear="%s" and sector="%s"\n' "$caseyear" "$sector"

스크립트는 .에 특정한 것을 사용하지 않습니다 bash. 그래서 인터프리터를 /bin/sh.

스크립트가 정확히 두 개의 매개변수를 얻지 못하면 즉시 종료됩니다. 첫 번째 매개변수가 수치적으로 2009보다 크거나 같은지 확인하여 이를 확인합니다. |두 번째 인수를 명령문의 -separated 목록에 있는 항목과 일치시켜 유효성을 검사 합니다 case.

명령문 case은 다음과 같이 더 적은 줄로 작성할 수도 있습니다.

case $sector in
        (11|40|44_45|52|10_11) ;;
        (*) echo 'sector (2nd arg) is not in list' >&2; exit 1 ;;
esac

패턴 문자열의 여는 대괄호는 각 경우에 선택 사항입니다. 마지막 사례 이후의 내용 ;;도 선택 사항입니다.

$1그리고 두 변수의 초기 할당은 $2약간 더 멋질 수 있으며, 두 매개 변수가 모두 존재하고 빈 문자열이 아닌지 확인하는 추가 검사가 도입됩니다.

caseyear=${1:?'1st argument caseyear must be specifiend and not empty'}
sector=${2:?'2nd argument sector must be specified and not empty'}

변수가 설정되지 않거나 비어 있으면 확장으로 인해 ${variable:?string}문자열이 출력됩니다. 이런 일이 발생하면 스크립트는 0이 아닌 종료 상태로 종료됩니다. 이를 통해 올바른 테스트를 삭제할 수 있습니다.stringvariable$#

내가 아는 한, 이 두 변수를 내보낼 필요는 없습니다. 해당 환경에서 이러한 변수가 필요한 일부 외부 도구를 시작하는 경우 다음을 사용하여 외부 도구를 실행하기 전에 위 코드 끝에서 한 번에 내보낼 수 있습니다.

export caseyear sector
some-other-utility

관련 정보