【问题标题】:Shell: Checking if argument exists and matches expressionShell:检查参数是否存在并匹配表达式
【发布时间】:2014-09-30 19:03:00
【问题描述】:

我是 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 结尾,它会回显相同的错误。

但是,我还想检查完整的文件名是否为 YYYY-MM.tar.gz 格式。

【问题讨论】:

    标签: regex bash shell


    【解决方案1】:
    if [[ -n "$1" ]] && [[ "${1#*.}" == "tar.gz" ]]; then
    

    -eq:(等于)用于算术测试

    ==: 比较字符串

    见:help test

    【讨论】:

    • 谢谢!添加第二对 [] 有助于解决我的问题。
    【解决方案2】:

    你也可以使用:

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

    【讨论】:

      【解决方案3】:

      只要文件是正确的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 个月(没有前导零)。

      【讨论】:

      • 您可以对任意数量的答案进行投票;你只能接受一个你认为最有帮助的。
      猜你喜欢
      • 2014-10-03
      • 2012-12-16
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 2012-06-11
      • 1970-01-01
      相关资源
      最近更新 更多