사용자가 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이 아니도록 요구하는 것 외에 다른 방법이 있습니다.