입력한 수량이 한도 이내인지 확인하는 방법

입력한 수량이 한도 이내인지 확인하는 방법

사용자가 3개 미만 또는 3개 이상 입력하는 경우 사용자 정의 오류 메시지를 표시할 수 있도록 3개의 입력을 읽고 계산하고 싶습니다. 내가 작성하려는 프로그램의 코드는 다음과 같습니다.

echo "Enter three names"
read name1 name2 name3

입력이 정확히 세 개의 이름이 되도록 이러한 입력을 검증하고 싶습니다. 그 이하도 아니고 그 이상도 아닙니다.

답변1

한 번에 세 개의 이름을 읽으면 실제로 세 개의 이름을 가지고 있는지 쉽게 확인할 수 없습니다. 특히 이름에 공백이 포함되는 경향이 있기 때문입니다. 당신은 감지할 수 있습니다더 적은세 개의 이름 대신 변수가 비어 있는지 테스트하면 문제가 절반만 해결됩니다.

대신 각 이름을 개별적으로 읽으십시오.

echo 'Enter three names:' >&2
read -r -p 'Name 1: ' name1
read -r -p 'Name 2: ' name2
read -r -p 'Name 3: ' name3

이렇게 하면 사용자가 너무 많은 이름을 입력하는 것을 방지할 수 있습니다(각 read호출은 하나의 이름을 읽고 그 중 세 개만 읽으므로).

if [ -z "$name1" ] ||
   [ -z "$name2" ] ||
   [ -z "$name3" ]
then
    echo 'One or more names were empty!' >&2
    exit 1
fi

또는 너무 적은 이름이 입력되었는지 감지하는 것과 유사한 것입니다.

또는 배열의 이름을 원하는 경우:

echo 'Enter three names:' >&2
for (( i=1; i<=3; ++i )); do
    read -r -p "Enter name $i: " name[i]
done

${name[i]}그런 다음 읽은 후 직접 확인하거나 나중에 별도의 루프에서 확인할 수 있습니다 .

나는 다음과 같은 일을 할 수도 있습니다

echo 'Enter three names:' >&2
for (( i=1; i<=3; ++i )); do
    if ! read -r -p "Enter name $i: " name[i] || [ -z "${name[i]}" ]
    then
        echo 'Invalid input, exiting' >&2
        exit 1
    fi
done

파일 끝(사용자가 누름 Ctrl+D) 또는 빈 항목을 오류로 처리하고 종료합니다.

또는,

echo 'Enter three names:' >&2
for (( i=1; i<=3; ++i )); do
    while true; do
        if ! read -r -p "Enter name $i: " name[i]; then
            echo 'Ok, bye' >&2
            exit 1
        elif [ -n "${name[i]}" ]; then
            # string is non-empty (good!), skip to next name
            break
        fi
        echo 'Empty input, try again' >&2
    done
done

이렇게 하면 사용자가 키를 눌러 스크립트를 종료할 수 Ctrl+D있으며 입력한 문자열이 비어 있으면 사용자에게 이름을 다시 입력하라는 메시지가 표시됩니다. 이 입력 루프를 사용하면 다음을 수행할 수도 있습니다.사용자 입력 검증null이 아니도록 요구하는 것 외에 다른 방법이 있습니다.

관련 정보