Validating Input

Problem

You’ve asked for input (e.g., from a user or a program) and to ensure security or data integrity you need to make sure you got what you asked for.

Solution

There are various ways to validate your input, depending on what the input is and how strict you need to be.

Use pattern matching for simple “it matches or it doesn’t” situations (see Testing for Equal, Testing with Pattern Matches, and Testing with Regular Expressions).

[[ "$raw_input" == *.jpg ]] && echo "Got a JPEG file."

Use a case statement when there are various things that might be valid (see Branching Many Ways and Parsing Command-Line Arguments).

# cookbook filename: validate_using_case

case $raw_input in
    *.company.com        ) # Probably a local hostname
        ;;
    *.jpg                ) # Probably a JPEG file
        ;;
    *.[jJ][pP][gG]       ) # Probably a JPEG file, case insensitive
        ;;
    foo | bar            ) # entered 'foo' or 'bar
        ;;
    [0-9][0-9][0-9]      ) # A 3 digit number
        ;;
    [a-z][a-z][a-z][a-z] ) # A 4 lower-case char word
        ;;
    *                    ) # None of the above
        ;;
esac

Use a regular expression when pattern matching isn’t specific enough and you have bash version 3.0+ (see Testing with Regular Expressions). This example is looking for a three to six alphanumeric character filename with a .jpg extension (case sensitive):

[[ "$raw_input" =~ [[:alpha:]]{3,6}\.jpg ]] && echo "Got a JPEG file."

Discussion

For a larger and more detailed example, see the examples/scripts/shprompt in a recent bash tarball. Note this was written by Chet Ramey, who maintains bash:

# shprompt -- ...

Get bash Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.