Regex to validate parameter for sleep


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Regex to validate parameter for sleep
# 1  
Old 11-05-2018
Regex to validate parameter for sleep

I'm trying to use a regular expression to validate a value for sleep entered by the user. The test should fail all negative values and 0 but let pass all combinations of + . and digits that would amount to a valid parameter for sleep.
Examples for valid: 1, 1.5, .5, 0.5, +1, +.5, +1.3 etc.
Examples for invalid: 0, .0, 0., 0.0, +0, +.0, +0, +0.0 etc. and any string starting with a -

I wrote a small program to test the regular expressions I'm using now - two expressions combined in a test statement. While looking a bit contrived they almost do the job except that strings like .1.1 still pass the test as valid.

Can someone help me take the final step?

Code:
#!/bin/bash

if [ $# -gt 0 ] ; then # user entered parameter for sleep
   # check fails if it's not a positive floating point number
   if ! [[ $1 =~ ^\+?\.?[0-9]+\.?[0-9]*$ ]] || [[ $1 =~ ^[\+-]?0?\.?0*$ ]]; then
      echo invalid value for sleep: $1
   else
     echo valid: $1
   fi
fi

Thanks.

------ Post updated at 01:08 PM ------

I found a solution by adding an && clause to the if condition:

Code:
if ! [[ $1 =~ ^\+?\.?[0-9]+\.?[0-9]*$ ]] || [[ $1 =~ ^[\+-]?0?\.?0*$ ]] && ! [[ $1 =~ ^\.*$ ]

but it looks even more contrived now.

Is there a way to solve the problem within one regular expression? Or something much shorter? (I'm not overly familiar with regular expressions and I expect an expert to come up easily with something shorter, humiliatingly shorter.)

------ Post updated at 01:10 PM ------

OMG. There's a ] missing at the end.
# 2  
Old 11-05-2018
Would this come close?
Code:
sed -r '/-/bW; /[1-9]/ {s/$/\tOK/; b}; :W; s/$/\tWRONG/' file
1       OK
1.5     OK
.5      OK
0.5     OK
+1      OK
.50     OK
0.5000  OK
+100    OK
+.5     OK
+1.3    OK
-1      WRONG
-.5     WRONG
-1.3    WRONG
.0      WRONG
0.      WRONG
0.0     WRONG
+0      WRONG
+.0     WRONG
+0      WRONG
+0.0    WRONG

# 3  
Old 11-05-2018
As close as I am now. But the same numbers still slip through.

With this in 'file':
Code:
1
1.5
.5
.0.5
.1.1
.1.3.5

I get this output:

Code:
1	OK
1.5	OK
.5	OK
.0.5	OK
.1.1	OK
.1.3.5	OK

The last two are definitely not ok as parameter to sleep.

And how would I use the sed test in the script in place of the regular expression?

------ Post updated at 02:42 PM ------

This is the output I would need to see:

Code:
1       OK
1.0     OK
.1      OK
0.1     OK
+1      OK
+1.0    OK
+.1     OK
-1      WRONG
-1.0    WRONG
-.1     WRONG
0       WRONG
-0      WRONG
+0      WRONG
.0      WRONG
-.0     WRONG
+.0     WRONG
0.0     WRONG
-0.0    WRONG
+0.0    WRONG

And how would I use sed as a substitute for the regular expression in the if statement in my original post?
# 4  
Old 11-05-2018
OK, multiple dots, and any non-numeric characters discriminated as well:


Code:
sed -r '/[^0-9+.]/bW; /([.]).*\1/bW; /[1-9]/ {s/$/\tOK/; b}; :W; s/$/\tWRONG/' file
1       OK
1.5     OK
.5      OK
0.5     OK
+1      OK
.50     OK
0.5000  OK
+100    OK
+.5     OK
+1.3    OK
0.5a000 WRONG
+100b   WRONG
+.5;    WRONG
+z1.3   WRONG
-1      WRONG
-.5     WRONG
-1.3    WRONG
.0      WRONG
0.      WRONG
0.0     WRONG
+0      WRONG
+.0     WRONG
+0      WRONG
+0.0    WRONG
.0.5    WRONG
.1.1    WRONG
.1.3.5  WRONG


You could run the sedwith a "here-string" like
Code:
$ set -- .1.3.5
$ sed -r '/[^0-9+.]/bW; /([.]).*\1/bW; /[1-9]/ {s/$/\tOK/; b}; :W; s/$/\tWRONG/' <<< $1
.1.3.5    WRONG

# 5  
Old 11-05-2018
And then parse the sed output for the word 'WRONG' or 'OK'?

It would work but it it's not very elegant, kind of overkill.

I think the best way is to let the original if statement do the entire job. I just need to give it the right regex (or something else) to work on.

And I'd really like to get the regex right. :-)
# 6  
Old 11-05-2018
Code:
$ if sed -r '/[^0-9+.]|([.]).*\1/q1; /[1-9]/q0; q1' <<< $1
     then echo valid: $1
     else echo invalid value for sleep: $1
  fi


Last edited by RudiC; 11-05-2018 at 11:43 AM..
This User Gave Thanks to RudiC For This Post:
# 7  
Old 11-05-2018
I'm impressed (though after running the code I think the then and else sections should be reversed - see below.)

I admit I'll have to spend a day with sed one of these days and I will, but just assuming all is well - and it looks like it is - what's the exit status of sed used by if here?

According to sed documentation sed returns 0 on successful completion and 1 if it encounters an invalid command, invalid syntax. The latter doesn't seem to be the case here.

In your code it looks like sed returns 0 for a valid value and 1 for an invalid one.

With tplus being (then/else reversed and echo $? added by me):

Code:
if sed -r '/[^0-9+.]|([.]).*\1/q1; /[1-9]/q0; q1' <<< $1
   then echo exit status: $?; echo valid: $1
else 
   echo exit status: $?; echo invalid: $1
fi

this is the output I get:

Code:
$ bash tplus 0
0
exit status: 1
invalid: 0
$ bash tplus 1
1
exit status: 0
valid: 1
$

And... er... do you have a suggestion how to do it in a naked regular expression within [[ ... ]], without using sed or another program?
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Sendmail K command regex: adding exclusion/negative lookahead to regex -a@MATCH

I'm trying to get some exclusions into our sendmail regular expression for the K command. The following configuration & regex works: LOCAL_CONFIG # Kcheckaddress regex -a@MATCH +<@+?\.++?\.(us|info|to|br|bid|cn|ru) LOCAL_RULESETS SLocal_check_mail # check address against various regex... (0 Replies)
Discussion started by: RobbieTheK
0 Replies

2. Shell Programming and Scripting

Call Script with Parameter (that has another parameter)

Hi. How do I achieve this sh /EDWH-DMT02/script/MISC/exec_sql.sh "@/EDWH-DMT02/script/others/CSM_CKC/Complete_List.sql ${file_name}" Complete_List.txt The /EDWH-DMT02/script/MISC/exec_sql.sh has two parameters and it's working fine with this sh /EDWH-DMT02/script/MISC/exec_sql.sh... (7 Replies)
Discussion started by: aimy
7 Replies

3. Shell Programming and Scripting

Resolving a parameter which is passed as parameter

Hi, I have the following files. ->cat scr.sh export TMP_DIR=/home/user/folder1 export TMP_DIR_2=/home/user/folder2 while read line do cat "$line" done<file_list.dat ------------------------ -> cat file_list.dat $TMP_DIR/file1.txt $TMP_DIR_2/file2.txt --------------------------- -> cat... (6 Replies)
Discussion started by: barath
6 Replies

4. Shell Programming and Scripting

Passing parameter to script, and split the parameter

i am passing input parameter 'one_two' to the script , the script output should display the result as below one_1two one_2two one_3two if then echo " Usage : <$0> <DATABASE> " exit 0 else for DB in 1 2 3 do DBname=`$DATABASE | awk -F "_" '{print $1_${DB}_$2}` done fi (5 Replies)
Discussion started by: only4satish
5 Replies

5. Shell Programming and Scripting

Command that takes one parameter and then searches for the passed in parameter

Hi I am looking for a unix command or a small shell script which can takes one parameter and then searches for the passed in the parameter in any or all files under say /home/dev/ Can anyone please help me on this? (3 Replies)
Discussion started by: pankaj80
3 Replies

6. Shell Programming and Scripting

Converting perl regex to sed regex

I am having trouble parsing rpm filenames in a shell script.. I found a snippet of perl code that will perform the task but I really don't have time to rewrite the entire script in perl. I cannot for the life of me convert this code into something sed-friendly: if ($rpm =~ /(*)-(*)-(*)\.(.*)/)... (1 Reply)
Discussion started by: suntzu
1 Replies

7. Shell Programming and Scripting

Using regex in sed to validate the length of an entry

I'm having trouble using sed to validate the length of an entry. I want to have a user enter a phone number of either length 7, 10 or 11. Only numbers are allowed. Does anyone know how to do this? Here's the code I have so far. It only validates that numbers are entered but not the length. ... (1 Reply)
Discussion started by: snag49ers
1 Replies

8. Shell Programming and Scripting

Wrapping 'sleep' with my 'resleep' function (Resettable sleep)

This is a very crude attempt in Bash at something that I needed but didn't seem to find in the 'sleep' command. However, I would like to be able to do it without the need for the temp file. Please go easy on me if this is already possible in some other way: How many times have you used the... (5 Replies)
Discussion started by: deckard
5 Replies

9. Shell Programming and Scripting

how do I make dynamic parameter names? Or get the value of a parameter evaluated twi

Say I write something like the following: var1=1 var2=2 for int in 1 2 do echo "\$var$int" done I want the output to be: 1 2 Instead I get something like: $var1 $var2 (2 Replies)
Discussion started by: Awanka
2 Replies
Login or Register to Ask a Question