我想检查第一个命令行参数 ( $1
) 是否至少有 10 个字符以及是否为空。
该脚本被称为:
./myscript.sh 2018-08-14
我试过了,但没用
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
答案1
出色地,
if [ "$1" == "" ] || [ $# -gt 1 ]; then echo "Parameter 1 is empty"
首先,使用=
代替==
.前者是标准的,后者是 bashism 的(尽管我认为它也来自 ksh)。其次,这里的逻辑不正确:if $#
is比...更棒一,那么参数 1 可能不为空(不过,它可能被设置为空字符串)。也许你的意思是"$#" -lt 1
,尽管那也意味着这一点"$1" = ""
。测试应该足够了[ "$1" = "" ]
,或者[ "$#" -lt 1 ]
。
elif [! "${#timestamp}" -gt 10 ]; then
在这里,shell 将尝试运行一个名为[!
(字面意思)的命令。中间需要有一个空格,所以[ ! "${#timestamp}" -gt 10 ]
.但这与 相同[ "${#timestamp}" -le 10 ]
,它也会捕获正好 10 个字符的字符串,例如2018-08-14
。
所以也许你想要[ "${#timestamp}" -ne 10 ]
。(!=
相反-ne
也可以工作,即使它是字符串比较。)
if ... exit 0
通常在发生错误时返回非零退出代码,因此exit 1
在错误分支中使用。
您还可以使用case
or[[ .. ]]
将参数与预期格式进行模式匹配,例如:
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
这也会拒绝像 之类的参数abcdefghij
,即使它有 10 个字符长。
答案2
尝试下面的脚本,
选项1
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
选项2
[[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date -d "$1"