检查命令行参数

use*_*422 12 shell bash command line

我想检查第一个命令行参数 ( $1) 是否至少有 10 个字符,以及它是否为空。

该脚本被称为:

./myscript.sh 2018-08-14
Run Code Online (Sandbox Code Playgroud)

我试过这个,但它不起作用

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
Run Code Online (Sandbox Code Playgroud)

ilk*_*chu 11

好,

if [ "$1" == "" ] || [ $# -gt 1 ]; then
        echo "Parameter 1 is empty"
Run Code Online (Sandbox Code Playgroud)

首先,使用=代替==。前者是标准的,后者是 bashism(虽然我认为它也来自 ksh)。其次,这里的逻辑是不正确的:如果$#大于一个,那么参数1也许不为空(它可能被设置为空字符串,虽然)。也许您的意思是"$#" -lt 1,尽管这也意味着"$1" = ""。测试一下应该就够了[ "$1" = "" ],或者[ "$#" -lt 1 ]

elif [! "${#timestamp}" -gt 10 ]; then
Run Code Online (Sandbox Code Playgroud)

在这里,shell 会尝试运行一个名为[!(字面意思)的命令。中间需要一个空格,所以[ ! "${#timestamp}" -gt 10 ]. 但这与 相同[ "${#timestamp}" -le 10 ],它也会捕获恰好 10 个字符的字符串,例如2018-08-14.

所以也许你想要[ "${#timestamp}" -ne 10 ]!=而不是-ne也可以工作,即使它是一个字符串比较。)

if ...
    exit 0
Run Code Online (Sandbox Code Playgroud)

发生错误时通常以非零退出代码返回,因此exit 1在错误分支中使用。


您还可以使用case[[ .. ]]将参数与预期格式进行模式匹配,例如:

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
Run Code Online (Sandbox Code Playgroud)

abcdefghij即使它有 10 个字符长,这也会拒绝像 一样的参数。


Sta*_* EG 4

尝试下面的脚本,

选项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
Run Code Online (Sandbox Code Playgroud)

选项2

[[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date -d "$1"
Run Code Online (Sandbox Code Playgroud)

  • 对于空的“$1”,“[ -z $1 ]”将返回 true,因为您忘记引用“$1”,因此它会变成“[ -z ]”,用于测试“-z”字符串是否为非空 (6认同)