Improving this validate function


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Improving this validate function
# 1  
Old 10-28-2010
Improving this validate function

Hi guys, I use this function which was provided to me by someone at this site. It works perfectly for validating a users input option against allowed options..

example:

validateInput "1" "1 3 4 5" would return 0 (success)

Code:
function validateInput {
 input=$1
 allowedInput=$2
 
 for allowedOption in ${allowedInput}
 do
  if [ ${input} -eq ${allowedOption} ]
  then
   return 0
  fi
 done
 
 return 1
}

but now we allow users to enter more than 1 number and so this validate needs to be improved

validateInput "16" "1 3 4 5" this should return fail (1) as 6 is not in the allowedInput string.. currently the function return success because "1" is in the allowedInput string.. but I somehow need it to verify all the numbers in the first parameter

any ideas guys?
# 2  
Old 10-28-2010
Well, now you need to validate the number of arguments, and validate each one separately.

Code:
validateInputs(){

 inputs=$1
 allowedInput=$2
 min_args=$3
 max_args=$4
 arg_ct=0
 inval_args=""

 for input in $inputs qzzq
 do
  if [ $input = qzzq ]
  then
   break
  fi

  for allowedOption in ${allowedInput}
  do
   if [ ${input} -eq ${allowedOption} ]
   then
    inval_args="$inval_args $input"
   fi
  done
  (( $arg_ct += 1 ))
 done

 if [ "$inval_args" != "" ]
 then
  echo "Invalid:$inval_args" >/dev/tty
  return 1
 fi

 if (( $arg_ct > $max_args || $arg_ct < $min_args ))
 then
  return 2
 fi

 return 0
}

# 3  
Old 10-28-2010
Quote:
validateInput "16" "1 3 4 5" this should return fail (1) as 6 is not in the allowedInput string.. currently the function return success because "1" is in the allowedInput string.. but I somehow need it to verify all the numbers in the first parameter
Code:
$
$
$ cat -n f38
     1  #!/usr/bin/bash
     2  x=$1
     3  y=$2
     4  i=0
     5  while [ $i -lt ${#x} ]; do
     6    d=${x:$i:1}
     7    if ! [[ " $y " =~ " $d " ]]
     8    then
     9      echo "$d does not exist in $y"
    10      return 1
    11    fi
    12    i=`expr $i + 1`
    13  done
    14  echo "$x exists in $y"
    15  return 0
$
$
$ . f38 "1" "1 2 3 4"
1 exists in 1 2 3 4
$
$
$ . f38 "123" "1 2 3 4"
123 exists in 1 2 3 4
$
$
$ . f38 "0123" "1 2 3 4"
0 does not exist in 1 2 3 4
$
$
$ . f38 "1236" "1 2 3 4"
6 does not exist in 1 2 3 4
$
$
$ . f38 "1237" "1 2 3 77 4"
7 does not exist in 1 2 3 77 4
$
$

tyler_durden
# 4  
Old 10-28-2010
And another one:

Code:
validateInput() {
  input=$1 allowedInput=$2
  while [ -n "$input" ]; do
  c=${input%${input#?}} input=${input#$c}
    case $allowedInput in
      ( *$c* )          ;;
      (   *  ) return 1 ;;
    esac
  done
  }


Last edited by radoulov; 10-29-2010 at 06:24 AM..
# 5  
Old 10-28-2010
You want to be able to validate any word in a space delimited list, not every byte, right?

You might change your input validation to a case string, somewhat more varsatile with | (or), [abc] (list of char) and such:
Code:
#!/usr/bin/ksh

valInp(){

for i in $1 qzzq
do
 bad_args=""

 case "$i"  in
 (qzzq)
   ;;
 ($2)
   ;;
 (*)
   bad_args="$bad_args $i"
   ;;
 esac
done

if [ "$bad_args" != "" ]
then
 return 1
fi
}


Using a grep -E regex-pattern would be even more powerful.
Code:
#!/usr/bin/ksh

valInp(){

bad_args=""

echo $1 | tr ' ' '\12' | grep -Ev "$2" | while read bad
do
 bad_args="$bad_args $bad"
done

if [ "$bad_args" != "" ]
then
 return 1
fi
}


Last edited by DGPickett; 10-28-2010 at 05:18 PM..
Login or Register to Ask a Question

Previous Thread | Next Thread

7 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Improving repetitive tasks in function

stop_service () { sudo systemctl is-active --quiet video.service && sudo systemctl stop video.service && sudo rm /etc/systemd/system/video.service && echo stop video sudo systemctl is-active --quiet audio.service && sudo systemctl stop audio.service && sudo rm /etc/systemd/system/audio.service... (4 Replies)
Discussion started by: aristosv
4 Replies

2. Shell Programming and Scripting

Improving code

Gents, I did the below code to get an output (report) ,.. the code works fine but I believe it can be more shorted using better method. Please if you can help, to generate same output improving the code , will be great. here my code. # get diff in time awk '{$9=$8-prev8;prev8=$8;print... (8 Replies)
Discussion started by: jiam912
8 Replies

3. Shell Programming and Scripting

Need help improving my script.

Thank you for taking the time to look at this and provide input. To start, I am not a linux/unix expert but I muddle through the best I can. I am also in no way shape or form a programmer. Please keep that in mind as you read this script. This script is designed to find all files in a given... (8 Replies)
Discussion started by: garlandxj11
8 Replies

4. Shell Programming and Scripting

Basic help improving for in loop

I'm obviously very new to this. I'm trying to write a simple for loop that will read the directory names in /Users and then copy a file into the same subdir in each user directory. I have this, and it works but it isn't great. #!/bin/bash HOMEDIRS=/Users/* for dirs in $HOMEDIRS; do if ];... (5 Replies)
Discussion started by: Heath_T
5 Replies

5. Shell Programming and Scripting

Improving code by using associative arrays

I have the following code, and I am changing it to #!/bin/bash hasArgumentCModInfile=0 hasArgumentSrcsInfile=0 hasArgumentRcvsInfile=0 OLDIFS="$IFS" IFS="|=" # IFS controls splitting. Split on "|" and "=", not whitespace. set -- $* # Set the positional... (3 Replies)
Discussion started by: kristinu
3 Replies

6. UNIX for Dummies Questions & Answers

Improving Unix Skills

Kindly any advice to improve my unix skills as electronic books i can download or valuable sites as this one etc... (3 Replies)
Discussion started by: sak900354
3 Replies

7. Shell Programming and Scripting

improving my script

Hi; I want to access our customer database to retreive all clients that have as language index 2 or 3 and take their client number. My input is a file containing all client numbers. i access the data base using a function call "scpshow". The total number of clients i want to scan is 400 000... (6 Replies)
Discussion started by: bcheaib
6 Replies
Login or Register to Ask a Question