변경하는 방법 [[! $number =~ ^[0-9]+$ ]]를 BASH의 단어 옵션으로 바꾸시겠습니까?

변경하는 방법 [[! $number =~ ^[0-9]+$ ]]를 BASH의 단어 옵션으로 바꾸시겠습니까?

일부 소프트웨어를 실행하는 데 필요한 파일을 작성하는 스크립트에 입력이 있지만 소프트웨어는 LO 및 LDO라는 두 가지 가능한 옵션 중 하나만 허용합니다.

내가 작성한 입력은 아래 코드의 상단에 있고 하단의 코드는 제가 수행하도록 제안된 것입니다.

"Overlap (LO or LDO):"라는 질문을 드리고 싶은데, 옵션 중 하나가 입력되지 않으면 오류 메시지가 나타나며, 전체 스크립트를 다시 진행하는 대신 해당 단계를 반복하게 됩니다. 0과 0 값 9

내가 아는 한 LO 및 LDO를 포함하려면 ^[0-9]를 변경해야 하지만 구두점이 무엇인지, 어떻게 해야 하는지 잘 모르겠습니다.

### My Script ###
read -p "Overlap (LO or LDO): " OVERLAP

### Recommended Script ###
#!bin/bash
number=""
while [[ ! $number =~ ^[0-9]+$ ]]; do
    echo Please enter your age
    read number
done
echo You are $number years old

답변1

입력 및 유효성 검사 루프는 일반적으로 다음과 같이 작성됩니다.

while true; do
    read -p 'Overlap (LO or LDO): ' overlap

    case $overlap in
        LO|LDO) # ok
            break
            ;;
        *) # not ok
            echo 'Please enter LO or LDO' >&2
    esac
done

즉, 답이 맞는지 확인하면 무한루프가 깨지게 됩니다.

분명히 당신도 할 수 있습니다

while true; do
    read -p 'Overlap (LO or LDO): ' overlap

    if [ "$overlap" = LO ] || [ "$overlap" = LDO ]; then
        # ok
        break
    fi
    # not ok
    echo 'Please enter LO or LDO' >&2
done

또는 다음 기능을 갖춘 셸을 사용하세요 select.

echo 'Select overlap:' >&2
select overlap in LO LDO; do
    case $REPLY in
        [12]) # ok
            break
            ;;
        *) # not ok
            echo 'Please select LO or LDO' >&2
    esac
done

답변2

&&and 연산자를 사용할 수 있습니다 .

#! /bin/bash
overlap=""
first=1
while [[ $overlap != LO && $overlap != LDO ]] ; do
    if [[ ! $first ]] ; then
        echo 'Wrong answer, please answer LO or LDO!' >&2
    fi
    read -p 'Overlap (LO or LDO): ' overlap
    unset first
done

정규식을 사용할 수도 있습니다.

until [[ $overlap =~ ^LD?O$ ]] ; do
    ...
  • ^문자열의 시작과 일치합니다.
  • ?이전 항목을 선택 사항으로 설정
  • $문자열의 끝과 일치

답변3

또 다른 방법

while read -p "Overlap (LO or LDO): " overlap;
do
 [[ "$overlap" =~ ^LD?O$ ]] && break || echo "Not LO or LDO"
done

관련 정보