나는 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이 아닌 종료 상태로 종료됩니다. 이를 통해 올바른 테스트를 삭제할 수 있습니다.string
variable
$#
내가 아는 한, 이 두 변수를 내보낼 필요는 없습니다. 해당 환경에서 이러한 변수가 필요한 일부 외부 도구를 시작하는 경우 다음을 사용하여 외부 도구를 실행하기 전에 위 코드 끝에서 한 번에 내보낼 수 있습니다.
export caseyear sector
some-other-utility