2014-09-30 52 views
3

我是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它Echo的同样的错误。

但是,我想要检查整个文件名是否是YYYY-MM.tar.gz格式。

回答

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

-eq:(等于)进行算术测试

==:比较字符串

参见:help test

+0

谢谢!添加第二对[]帮助解决了我的问题。 – Mark 2014-10-01 16:01:57

2

您还可以使用:

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

整洁,更易读/可维护 – 2014-09-30 19:48:18

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 

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

+0

这也有帮助,但我不能两次投票。 – Mark 2014-10-01 16:00:50

+0

您可以根据自己的喜好多选答案;你只能接受一个你认为最有帮助的人。 – chepner 2014-10-01 16:38:41

+0

我没有足够的积分来upvote:/ – Mark 2014-10-01 18:00:49

相关问题