check command line arguments
Solution 1
Well,
if [ "$1" == "" ] || [ $# -gt 1 ]; then echo "Parameter 1 is empty"
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 ]
.
elif [! "${#timestamp}" -gt 10 ]; then
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, like 2018-08-14
.
So maybe you want [ "${#timestamp}" -ne 10 ]
. (!=
instead of -ne
would also work, even though it's a string comparison.)
if ... exit 0
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.:
case "$1" in
"")
echo date is empty
exit 1;;
[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9])
echo date is ok;;
*)
echo "date is _not_ ok"
exit 1;;
esac
That would also reject arguments like abcdefghij
, even though it's 10 characters long.
Solution 2
Try the below script,
Option1
timestamp="$1"
# check if command line argument is empty or not present
if [ -z $1 ]; then
echo "Parameter 1 is empty"
exit 0
elif [ "${#timestamp}" -lt 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
Option2
[[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date -d "$1"
Related videos on Youtube
user305422
Updated on September 18, 2022Comments
-
user305422 almost 2 years
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
-
Stéphane Chazelas almost 6 years
[ -z $1 ]
would return true for an empty$1
as you forgot to quote$1
, so it would become[ -z ]
which tests that the-z
string is non-empty -
Stéphane Chazelas almost 6 yearsOr
-ne
for a numeric comparison, not that it would make any difference in practice. -
Timo about 2 years@StéphaneChazelas what is the diff between
""
and not using it? Using it means that there is always two chars, so not empty? -
Timo about 2 yearsCheck the top answer to see the exit code used for error. Moreover, you should explain the tilde as I do not see it often in bash.
-
Stéphane Chazelas about 2 years@Timo, see for instance When is double-quoting necessary?