2013-09-11 8 views
8

मुझे एक शेल स्क्रिप्ट बनाना है जिसमें पैरामीटर में से एक प्रारूप प्रारूप डीडी/मिमी/yyyy में दिनांक होगा। मेरा सवाल यह है कि, मैं कैसे जांच सकता हूं कि पैरामीटर के रूप में पारित तिथि वास्तव में इस दिनांक प्रारूप का पालन करती है या नहीं? मैं नीचे के रूप में ग्रेप आदेश का उपयोग करने की कोशिश की:शेल स्क्रिप्ट में दिनांक प्रारूप मान्य करें

if echo "$1" | grep -q '^[0-3][0-9]/[0-1][0-9]/[0-9]\{4\}$' 

लेकिन क्योंकि उदाहरण के लिए दिन 33, 34, (...) हो सकता है यह सही स्वरूप नहीं दिया, जो वास्तव में सही स्वरूप नहीं है । किसी को कुछ ऐसा पता है जो वास्तव में जांच सकता है कि क्या तारीख वास्तव में प्रारूप डीडी/मिमी/yyyy प्रारूपित करती है?

+0

यह भी देखें http://unix.stackexchange.com/a/236374/106927 –

उत्तर

19

उपयोग date

date "+%d/%m/%Y" -d "09/99/2013" > /dev/null 2>&1 
is_valid=$? 

आप तो 0 नहीं मिलता है तिथि अमान्य प्रारूप में है।

+0

आपके उत्तर के लिए धन्यवाद। यह वास्तव में काम करता है लेकिन सिर्फ प्रारूप mm/dd/yyyy के लिए। यदि आप टर्मिनल पर विकल्प देखते हैं -d केवल प्रारूप mm/dd/yyyy को जांचें। मैंने प्रारूप को बदलने की कोशिश की लेकिन यह जिस तरह से विकल्प कमांड के लिए विकल्प-डी के रूप में उपयोग नहीं करता है। –

+4

डब्ल्यूटीएफ? सवाल यह था कि 'मैं कैसे जांच सकता हूं कि पैरामीटर के रूप में पारित तिथि वास्तव में इस दिनांक प्रारूप का पालन करती है या नहीं। यह कुछ भी जांच नहीं करता है। 'तारीख'' विभिन्न प्रारूपों में तिथियां स्वीकार करता है। उदाहरण के लिए '' कल'' एक वैध प्रारूप है, 'date -d 'कल + 5 महीने 20: 00: 01'' भी मान्य है। –

+0

इसके अलावा '' date -d '05/20/1900''' मेरे लिए एक त्रुटि फेंकता है। यह आपके आर्किटेक्चर पर भी निर्भर करता है (तिथि सीमा 64-बिट सिस्टम के लिए बड़ी हो सकती है)। यह निश्चित रूप से जाने का रास्ता नहीं है। इसके बजाय [konsolebox का उत्तर] (http://stackoverflow.com/a/18736035/2698019) का उपयोग करें। –

2

सबसे पहले, regex का उपयोग कर इनपुट के रूप की जांच करें। फिर मिमी/डीडी/yyyy पर स्विच करने के लिए awk का उपयोग करें और सत्यापन करने के लिए तारीख का उपयोग करें। आप अपने if बयान में निम्नलिखित अभिव्यक्ति का उपयोग कर सकते हैं:

echo "$1" | egrep -q '^[0-3][0-9]/[0-1][0-9]/[0-9]{4}$' && date -d "$(echo "$1" | awk 'BEGIN{FS=OFS="/"}{print $2"/"$1"/"$3}')" >/dev/null 2>&1 
2

dd/mm/yyyy बिल्कुल बैश में के लिए सबसे आसान तरीका है:

if [[ $1 == [0-3][0-9]/[0-1][0-9]/[0-9][0-9][0-9][0-9] ]] 

या

if [[ $1 =~ ^[0-3][0-9]/[0-1][0-9]/[0-9]{4}$ ]] 
+0

ओपी ने कहा कि _didn't_ काम नहीं है , क्योंकि यह 33/19/2000 जैसी अमान्य तिथियों को स्वीकार करता है। – augurar

+0

@augurar हां मैं एक और सटीक बना सकता था। लेकिन फिर भी स्वीकृत समाधान अन्य प्रारूपों को स्वीकार नहीं कर सकता था, न कि सिर्फ 'डीडी/एमएम/वाई'। यह वास्तव में कोई फर्क नहीं पड़ता। – konsolebox

2

कैसे उपयोग करने के बारे awk:

echo "31/12/1999" | awk -F '/' '{ print ($1 <= 31 && $2 <= 12 && match($3, /^[1-9][1-9][1-9][1-9]$/)) ? "good" : "bad" }' 

यह "अच्छा" प्रिंट अगर इसकी मान्य दिनांक बाकी प्रिंट "बुरा"

+0

यह '31/02/2012' या' 2 9/02/2001' या '31/04/2000' या '' –

+0

जैसी तारीखों को मान्य करेगा) कई फाइलों में एकाधिक दिनांक प्रारूपों को प्रमाणित करने के लिए, जो कि मैं तारीख प्राप्त करने के लिए पहले से ही बाहर निकल रहा हूं। यह समाधान KonsoleBox या PxL के टी से बेहतर अनुरोध को फिट करता है। टी टोपी कहा जा रहा है, इस समाधान के बाद अनुरोध में तारीख का प्रारूप अलग है। यह 'echo" होना चाहिए 31/12/1999 "| awk -F '/' '{प्रिंट ($ 1 <= 12 && $ 2 <= 31 && मैच ($ 3,/^ [1-9] [1-9] [1-9] [1-9] $ /)) ? "अच्छा": "बुरा"} ' एकमात्र चेतावनी यह है कि '02/30/2014' पास होगा, भले ही यह कोई तारीख न हो, लेकिन यह मेरी आवश्यकताओं के लिए अभी भी सही है। – JNevill

1

यहाँ कुछ डेटा सत्यापन यह करने के लिए एक समारोह है:

# Script expecting a Date parameter in MM-DD-YYYY format as input 
verifyInputDate(){ 
    echo ${date} | grep '^[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]$' 
    if [ $? -eq 0 ]; then 
     echo "Date is valid" 
    else 
      echo "Date is not valid" 
    fi 
} 
+1

यह ओपीएस उदाहरण से बेहतर नहीं है। '99/87/0000' जैसी तिथियां आपके grep को पास कर देगी। – JNevill

-1

Blockquote

DATE = "$*" 

[[ "${DATE}" != @(((([123][0]|[012][1-9])|3[1])?([ \/._-])(0[13578]|1[02])?([ \/._-])(19|20)[0-9][0-9])|(([123][0]|[012][1-9])?([ \/._-])\ 
(0[469]|11)?([ \/._-])(19|20)[0-9][0-9])|(([12][0]|[01][1-9]|2[1-8])?([ \/._-])02?([ \/._-])(19|20)[0-9][0-9])|(29?([ \/._-])02?([ \/._-])\ 
(19|20(0[48]|[2468][048]|[13579][26])))) ]] && echo error || echo good) 
+0

हाय, 'echo good' के बाद आपने '' क्यों जोड़ा '? – chelabim

2
#! /bin/bash 

isDateInvalid() 
{ 
    DATE="${1}" 

    # Autorized separator char ['space', '/', '.', '_', '-'] 
    SEPAR="([ \/._-])?" 

    # Date format day[01..31], month[01,03,05,07,08,10,12], year[1900..2099] 
    DATE_1="((([123][0]|[012][1-9])|3[1])${SEPAR}(0[13578]|1[02])${SEPAR}(19|20)[0-9][0-9])" 

    # Date format day[01..30], month[04,06,09,11], year[1900..2099] 
    DATE_2="(([123][0]|[012][1-9])${SEPAR}(0[469]|11)${SEPAR}(19|20)[0-9][0-9])" 

    # Date format day[01..28], month[02], year[1900..2099] 
    DATE_3="(([12][0]|[01][1-9]|2[1-8])${SEPAR}02${SEPAR}(19|20)[0-9][0-9])" 

    # Date format day[29], month[02], year[1904..2096] 
    DATE_4="(29${SEPAR}02${SEPAR}(19|20(0[48]|[2468][048]|[13579][26])))" 

    # Match the date in the Regex 

    if ! [[ "${DATE}" =~ "^(${DATE_1}|${DATE_2}|${DATE_3}|${DATE_4})$" ]] 
    then 
     echo -e "ERROR - '${DATE}' invalid!" 
    else 
     echo "${DATE} is valid" 
    fi 
} 

echo 
echo "Exp 1: "`isDateInvalid '12/13/3000'` 
echo "Exp 2: "`isDateInvalid '12/11/2014'` 
echo "Exp 3: "`isDateInvalid '12 01 2000'` 
echo "Exp 4: "`isDateInvalid '28-02-2014'` 
echo "Exp 5: "`isDateInvalid '12_02_2002'` 
echo "Exp 6: "`isDateInvalid '12.10.2099'` 
echo "Exp 7: "`isDateInvalid '31/11/2000'` 
1

` एक्स = "2016-04-21" फिर नीचे दिए गए मान को 1 या 0 के लिए जांचें।

कैलecho $x | cut -c 1-4 2>/dev/null | grep -c echo $x | cut -c 9-10

यदि मान 1 है, तो यह मान्य है, अन्यथा यह मान्य नहीं है।

+0

क्या आपका मतलब "बैकटिक्स" है? आपको उन्हें अपने उत्तर में इस तरह दर्ज करना चाहिए, अन्यथा यह काम नहीं करेगा क्योंकि फिलहाल वे * एकल उद्धरण हैं। –

8

आसान समाधान, जो अभी भी पूरी तरह से काम करता है, निम्नलिखित है:

if [[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date -d "$1" >/dev/null 2>&1 
    ... 

यह 2 चेकों के संयोजन में शामिल हैं:

  • पहले भाग जांच करता है कि $1 इस प्रारूप के है: NNNN-NN-NN
  • दूसरा भाग जांचता है कि यह वैध दिनांक

आप दो चेकों की जरूरत है क्योंकि:

  • अगर आप पहली जांच नहीं करते हैं, date कोड 0 के साथ बाहर निकल जाएगा, भले ही आपके चर में कोई मान्य दिनांक किसी अन्य स्वरूप
  • है अगर आप डॉन 'टी दूसरे की जांच करते हैं, तो आप भी चर इस तरह के 2016-13-45
0

रूप में मैं इस बैश पटकथा लिखी तारीख को मान्य करने के लिए एक 0 के साथ खत्म हो सकता है। मैं mont को अल्फान्यूमेरिक के रूप में स्वीकार कर सकते हैं।

#!/bin/bash 

function isDateValid { 
    DATE=$1 

    if [[ $DATE =~ ^[0-9]{1,2}-[0-9a-zA-Z]{1,3}-[0-9]{4}$ ]]; then 
     echo "Date $DATE is a number!" 
     day=`echo $DATE | cut -d'-' -f1` 
     month=`echo $DATE | cut -d'-' -f2` 
     year=`echo $DATE | cut -d'-' -f3` 

       if [ "$month" == "01" ] || [ "$month" == "1" ]; then 
         month="Jan" 
       elif [ "$month" == "02" ] || [ "$month" == "2" ]; then 
         month="Feb" 
       elif [ "$month" == "03" ] || [ "$month" == "3" ]; then 
         month="Mar" 
       elif [ "$month" == "04" ] || [ "$month" == "4" ]; then 
         month="Apr" 
       elif [ "$month" == "05" ] || [ "$month" == "5" ]; then 
         month="May" 
       elif [ "$month" == "06" ] || [ "$month" == "6" ]; then 
         month="Jun" 
       elif [ "$month" == "07" ] || [ "$month" == "7" ]; then 
         month="Jul" 
       elif [ "$month" == "08" ] || [ "$month" == "8" ]; then 
         month="Aug" 
       elif [ "$month" == "09" ] || [ "$month" == "9" ]; then 
         month="Sep" 
       elif [ "$month" == "10" ]; then 
         month="Oct" 
       elif [ "$month" == "11" ]; then 
         month="Nov" 
       elif [ "$month" == "12" ]; then 
         month="Dec" 
       fi 

     ymd=$year"-"$month"-"$day 
     echo "ymd: "$ymd 
     dmy=$(echo "$ymd" | awk -F- '{ OFS=FS; print $3,$2,$1 }') 
     echo "dmy: "$dmy 
     if date --date "$dmy" >/dev/null 2>&1; then 
       echo "OK" 
      return 0 
     else 
       echo "NOK" 
      return 1 
     fi 
    else 
     echo "Date $DATE is not a number" 
     return 1 
    fi 
} 


if isDateValid "15-15-2014"; then 
    echo "date is valid =)" 
else 
    echo "bad format date" 
fi 
echo "===================" 
if isDateValid "15-12-2014"; then 
     echo "date is valid =)" 
else 
     echo "bad format date" 
fi 
echo "===================" 
if isDateValid "15-Dec-2014"; then 
     echo "date is valid =)" 
else 
     echo "bad format date" 
fi 
echo "===================" 
if isDateValid "1-May-2014"; then 
     echo "date is valid =)" 
else 
     echo "bad format date" 
fi 
echo "===================" 
if isDateValid "1-1-2014"; then 
     echo "date is valid =)" 
else 
     echo "bad format date" 
fi 
echo "===================" 
if isDateValid "12-12-2014"; then 
     echo "date is valid =)" 
else 
     echo "bad format date" 
fi 
संबंधित मुद्दे