2013-08-29 3 views
0

사용자가이 형식으로 입력을 제공하지 않을 때까지 같은 프롬프트가 반복해서 인쇄 될 때까지 쉘 코드로 DD/MM/YYYY 형식의 입력을 어떻게 할 수 있습니까?입력 루핑 루핑

printf "Please Enter START Date(DD/MM/YYYY)\n" 
read date1 

날짜가 DD/MM/YYYY 형식으로 제공되는지 여부를 확인하는 방법. 그렇다면이 루프를 다시 시작하는 방법은 무엇입니까?

답변

1

이 솔루션은 첫째을 사용하여 모든 토큰 입력의 의 구문을 확인하고 date 명령은 입력이 유효한 날짜인지 확인합니다. 예를 들어 20/02/02에 에 올바른 구문이 있지만 올바른 날짜가 아닙니다. 은 date 명령이 MM/DD/YYYY 형식을 허용한다는 점에 유의하십시오.

#!/bin/bash 

while [ 1 ]; do 
    IFS="/" read -p "Please Enter START Date(DD/MM/YYYY): " d m y 

    if [[ $d != [0-9][0-9] ]]; then echo "Day format invalid"; continue; fi 
    if [[ $m != [0-9][0-9] ]]; then echo "Month format invalid"; continue; fi 
    if [[ $y != [0-9][0-9][0-9][0-9] ]]; then echo "Year format invalid"; continue; fi 

    if date -d "$m/$d/$y" > /dev/null; then 
      date1="$d/$m/$y" 
      break 
    fi 

done 

# Here you can use $date1 as you prefer. For instance: 
echo $date1 
1

이 하나의 시도 :

until read -p "Please Enter START Date (DD/MM/YYYY): " && [[ $REPLY == [0-9][0-9]/[0-9][0-9]/[0-9][0-9] ]]; do 
    ## echo "Please enter in proper (DD/MM/YYYY) format." 
    continue 
done 

에코 부분은 당신이 추가하는 것을 고려 수 있다는 것을 단지 선택 사항입니다. 기본적으로 변수가 지정되지 않은 경우 $ REPLY 변수에 입력 된 장소를 읽지 만 원하는 경우 사용자 정의 값을 가질 수 있습니다. 조금

read -p "Please Enter START Date (DD/MM/YYYY): " INPUT && [[ $INPUT == ... 

더 쉬 호환하고 자신의 형식을 기반으로이있을 수 있습니다 :

#!/bin/sh 

while :; do 
    printf "Please Enter START Date(DD/MM/YYYY)\n" 
    read date1 
    case "$date1" in 
    [0-9][0-9]/[0-9][0-9]/[0-9][0-9]) 
     break 
     ;; 
    esac 
done 
+0

고맙습니다. – user2663468

+0

@ 두 번째 예를 들어 보면 [[0-9] [0-9]/[0-9] [0-9]/[0-9] [0-9]'not' [ 0-9] [0-9] | [0-9] [0-9] | [0-9] [0-9]'죄송합니다. 그리고 당신은 .. 환영합니다. – konsolebox