I would like to check if the first command line argument ($1
) has an minimum amount of 10 characters and if it is empty.
The script is called as:
./myscript.sh 2018-08-14
I tried this but it doesn't work
timestamp="$1"
# check if command line argument is empty or not present
if [ "$1" == "" ] || [ $# -gt 1 ]; then
echo "Parameter 1 is empty"
exit 0
elif [! "${#timestamp}" -gt 10 ]; then
echo "Please enter at least a valid date"
echo "Example: 2018-08-14"
exit 0
else
echo "THIS IS THE VALID BLOCK"
fi
Best Answer
Well,
First, use
=
instead of==
. The former is standard, the latter a bashism (though I think it's from ksh, too). Second, the logic here isn't right: if$#
is greater than one, then parameter 1 probably isn't empty (it might be set to the empty string, though). Perhaps you meant"$#" -lt 1
, though that would also imply that"$1" = ""
. It should be enough to test[ "$1" = "" ]
, or[ "$#" -lt 1 ]
.Here, the shell would try to run a command called
[!
(literally). You need a space in between, so[ ! "${#timestamp}" -gt 10 ]
. But that's the same as[ "${#timestamp}" -le 10 ]
, which would also catch strings of exactly 10 characters, like2018-08-14
.So maybe you want
[ "${#timestamp}" -ne 10 ]
. (!=
instead of-ne
would also work, even though it's a string comparison.)It's customary to return with a non-zero exit code in case of an error, so use
exit 1
in the error branches.You could also use
case
or[[ .. ]]
to pattern match the argument against the expected format, e.g.:That would also reject arguments like
abcdefghij
, even though it's 10 characters long.