Shell:检查参数是否存在并匹配表达式

时间:2014-09-30 19:03:01

标签: regex bash shell

我是shell脚本的新手,并尝试编写检查参数是否存在以及是否与表达式匹配的功能。我不确定如何编写表达式,所以这就是我到目前为止所做的:

#!/bin/bash

if [[ -n "$1"] && [${1#*.} -eq "tar.gz"]]; then
  echo "Passed";
else 
  echo "Missing valid argument"
fi

要运行脚本,我会输入以下命令:

# script.sh YYYY-MM.tar.gz

我相信我拥有的是

  1. 如果YYYY-MM.tar.gz不在script.sh之后,它将回显"缺少有效参数"和
  2. 如果文件没有以.tar.gz结尾,则回显相同的错误。
  3. 但是,我还要检查完整的文件名是否为YYYY-MM.tar.gz格式。

3 个答案:

答案 0 :(得分:4)

if [[ -n "$1" ]] && [[ "${1#*.}" == "tar.gz" ]]; then

-eq :(等于)算术测试

==:比较字符串

请参阅:help test

答案 1 :(得分:2)

您也可以使用:

case "$1" in
        *.tar.gz) ;; #passed
        *) echo "wrong/missing argument $1"; exit 1;;
esac
echo "ok arg: $1"

答案 2 :(得分:0)

只要文件采用正确的YYYY-MM.tar.gz格式,它显然是非空的,并且也以.tar.gz结尾。检查正则表达式:

if ! [[ $1 =~ [0-9]{4}-[0-9]{1,2}.tar.gz ]]; then
    echo "Argument 1 not in correct YYYY-MM.tar.gz format"
    exit 1
fi

显然,上面的正则表达式太笼统,允许使用0193-67.tar.gz之类的名称。但是,您可以根据应用需要将其调整为适合您的应用程序。我可能会推荐

[1-9][0-9]{3}-([1-9]|10|11|12).tar.gz

只允许从1000开始的4位数年份(支持第一个千年ACE似乎没必要),只有1-12个月(没有前导零)。