![변경하는 방법 [[! $number =~ ^[0-9]+$ ]]를 BASH의 단어 옵션으로 바꾸시겠습니까?](https://linux55.com/image/155493/%EB%B3%80%EA%B2%BD%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%20%5B%5B!%20%24number%20%3D~%20%5E%5B0-9%5D%2B%24%20%5D%5D%EB%A5%BC%20BASH%EC%9D%98%20%EB%8B%A8%EC%96%B4%20%EC%98%B5%EC%85%98%EC%9C%BC%EB%A1%9C%20%EB%B0%94%EA%BE%B8%EC%8B%9C%EA%B2%A0%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
일부 소프트웨어를 실행하는 데 필요한 파일을 작성하는 스크립트에 입력이 있지만 소프트웨어는 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