I am writing a small script to easily capture weights, which are taken from user input with read -p
.
I want all captured weights to be 4 characters long, decimal numbers in the format XX.X. For example 30.2 kg.
#!/bin/bash # take input from prompt (-p) and store it in $varweight read -p 'Enter weight in kg: ' varweight
How can I make sure users can only input decimal numbers in that format?
Thank you for your help.
Advertisement
Answer
One way would be to use a regex and assert the length to remove false positives (optionally). Of course the below would require the bash
shell because the ~
is not POSIX compliant
str="30.4" re='^[[:digit:]]{2}.[[:digit:]]$' if [[ $str =~ $re ]]; then echo 'true' fi
On a POSIX compliant shell though you could use case
statement
case $str in [0-9][0-9].[0-9]) echo good ;; *) echo bad;; esac
A much better POSIX compliant tool would be to use expr
to do the regex match.
if expr "$str" : '[[:digit:]]{2}.[[:digit:]]$' > /dev/null; then echo "true" fi