My date format is yyyy-mm-dd-hh:mm:ss How do I check my input?
It should be something like this:
#!/bin/bash
read -p "Date (format yy-mm-dd-HH-MM-SS): " input
check=$(date +"%Y-%m-%d-%H:%M:%S")
if [ $input -eq $check ]; do
echo "Right!"
else
echo "False!"
fi
But that doesn't check the date It compares my input with the real date.
Best Regards Vince
date +%S. Displays seconds [00-59] date +%N. Displays in Nanoseconds.
Bash Date Format MM-DD-YYYY To format date in MM-DD-YYYY format, use the command date +%m-%d-%Y . Please observe the upper and lower case letters : %m for month, %d for day and %Y for year.
Sample shell script to display the current date and time #!/bin/bash now="$(date)" printf "Current date and time %s\n" "$now" now="$(date +'%d/%m/%Y')" printf "Current date in dd/mm/yyyy format %s\n" "$now" echo "Starting backup at $now, please wait..." # command to backup scripts goes here # ...
See further (stronger method)
Try:
#!/bin/bash
read -p "Date (format yyyy-mm-dd): " input
check=$(date +%F)
if [ "$input" == "$check" ]; then
echo "Right!"
else
echo "False!"
fi
or
#!/bin/bash
read -p "Date (format YYYY-MN-DD-HH24:MM:SS): " input
check=$(date +%F-%T)
if [ "$input" == "$check" ]; then
echo "Right!"
else
echo "False!"
fi
Well tested:
cat >hesdate.sh # Copy 1st sample and paste to terminal
chmod +x hesdate.sh
date +%F ; ./hesdate.sh
2013-01-04
Date (format yyyy-mm-dd): 2013-01-04
Right!
cat >hesdate.sh # Copy 2nd sample and paste to terminal
date -d now\ +10\ sec +%F-%T ; ./hesdate.sh
2013-01-04-10:17:06 # copy this line
Date (format YYYY-MN-DD-HH24:MM:SS): 2013-01-04-10:17:06 # past exactly 10 secs after
Right!
Edit add
For testing a date, you could:
[[ $input =~ ^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$ ]]
if [[ $input =~ ^2012-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$ ]];then
and/or
inputSecs=$(date -d "${input%-*} ${input##*-}" +%s)
Using boot method let you confirm format and reliability of input
If you want to check input, there is a finer method:
unset adate
declare -A adate
date=2013-12-04-10:17:06
for field in s:0-59 m:0-59 h-0-23 D-1-31 M-1-12 Y#2000-2100 ;do
sep=${field:1:1} min=${field:2} field=${field:0:1} max=${min#*-} min=${min%-*}
crt=${date##*${sep:-#}}
((min<=10#$crt&&10#$crt<=max)) && adate[$field]=$crt ||
echo Error: $crt not between $min and $max in $field field.
date=${date%$sep*}
done
declare -p adate
This will dump adate
array variable:
declare -A adate='([D]="04" [M]="12" [Y]="2013" [h]="10" [m]="17" [s]="06" )'
From there, you could re-validate day number:
max=$(date -d "${adate[Y]}-${adate[M]}-1 +1 month -1 day" +%d)
((10#${adate[D]}>max)) && echo "Error Day number too high: (${adate[D]}>$max)."
The only thing not tested there is field length if
date=2012-02-29-10:17:06
will work, then
date=2012-2-29-10:17:06
will work too (there is only one digit in day field).
If needed, you could change the line:
for field in s:0-59 m:0-59 h-0-23 D-1-31 M-1-12 Y#2000-2100 ;do
sep=${field:1:1} min=${field:2} field=${field:0:1} max=${min#*-} min=${min%-*}
crt=${date##*${sep:-#}}
for
for field in s:20-59 m:20-59 h-20-23 D-21-31 M-21-12 Y#42000-2100 ;do
sep=${field:1:1} len=${field:2:1} min=${field:3} field=${field:0:1} max=${min#*-} min=${min%-*}
crt=${date##*${sep:-#}}
[ ${#crt} -eq $len ] || echo "Error: Field $field is no $len len: ${#crt}."
Nota: Year field is arbitrarily limited between 2000 and 2100, but this is easy to understand/change.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With