从输入参数进行模式匹配

从输入参数进行模式匹配

我们正在尝试增强我们的一个脚本。

用户将传递一些参数,部分参数将具有5.0.3.例如,输入参数类似于Jboss5.0.3GA。由于它( Jboss5.0.3GA )具有“5.0.3”,我们将尝试找到安装二进制文件“Jboss5.0.3GA.tar”。

我们现在的脚本是 ksh 脚本。我正在尝试if在脚本中使用条件。

示例用例和结果:

./test.sh Jboss5.0.3GA
Match found... we'll try to locate the installation binary
./test.sh Jboss5.0.3
Match found... we'll try to locate the installation binary
./test.sh 5.0.3
Match found... we'll try to locate the installation binary
./test.sh Jboss5.1.3
No Match found ... we'll be exiting the script.

答案1

POSIX shell 中的模式匹配是通过该case构造完成的。ksh也作为运算符(也由and[[ x = pattern ]]复制)以及最近的版本。bashzsh[[ x =~ regexp ]]

所以:

case $1 in
  (*5.0.3*)
    install=$1.tar
    echo Found;;
  (*)
    echo >&2 Not found
    exit 1;;
esac

答案2

我不是正则表达式方面的专家,但这至少对于您所描述的内容是有效的。

#!/bin/sh

argument="$1"

#if [[ $argument =~ [a-zA-Z]*5\.0\.3[a-zA-Z]+ ]]; then# only works on bash
if echo $argument | egrep -q '[a-zA-Z]*5\.0\.3[a-zA-Z]+'; then
  #echo "Found: ${BASH_REMATCH[0]}" # for bash
  echo "Match Found"

  # you can check for $argument at some other location, here.

else
  echo "No match"
fi

将其另存为test并运行它,给出以下结果:

bash test 333xxxx5.0.3xxxxx777
Match Found

bash test 333xxxx5.0.2xxxxx777
No match

bash test 5.0.3xxxxx777
Match Found

bash test 5.0.2xxxxx777
No match

您可以^在开头和$结尾添加,以匹配完整字符串或不匹配任何内容。像这样^[a-zA-Z]*5\.0\.3[a-zA-Z]+$

相关内容