Validate Swedish personal identity numbers with bash
The available methods are valid, format [bool:long], get_age, is_femal,
is_male and is_coordination_number.
The API allows you to pass the personal identification number as an optional
argument for all methods except valid. The code stores the parsed values
interally (in variables prefixed with __personnummer to avoid collision) so as
long as you start by calling valid (or the "internal" method __parse you can
omit the argument.
Special case for format which takes a "boolean" (true-ish) value to format to
long version. Although this is also handled which makes the way this method is
called handled three cases.
Implicit usage without passing arugment
#!/usr/bin/env bash
set -eu
source personnummer.sh
some_input="${1:-}"
if ! valid "$some_input"; then
echo "invalid input"
exit 1
fi
gender="$(is_female && echo "female" || echo "male")"
printf "> The person with personal identity number %s is a %s of age %d\n" \
"$(format)" "$gender" "$(get_age)"$ my_program.sh 19900101-0017
> The person with personal identity number 900101-0017 is a male of age 30A more explicit way
#!/usr/bin/env bash
set -eu
source personnummer.sh
# Getting gender with personal identification number as argument.
[ is_male "9001010017" ] && echo "It's a male"
# Formatting a personal identification number.
format "9001010017" # 900101-0017
format "9001010017" 1 # 19900101-0017
# Validate to allow implicit usage.
valid "199001010017"
format # 900101-0017
format 1 # 19900101-0017
# Get the age explicitly.
echo "The person is $(get_age "9001010017") years old"
# Check coordination number explicitly.
[ is_coordination_number "90010161+0017" ] && echo "It's a coordinational number"Testing is done with critic.sh which is
bundled in the repository. Just run test.sh for testing.