它必须匹配这个模式1001-N-N并忽略其他任何内容。

它必须匹配这个模式1001-N-N并忽略其他任何内容。

我的主机名如下

www-foo-1001-1-1.example.com

我正在编写脚本,应部署具有以下字符串匹配的应用程序1001-<any digit>-<any digit>

示例:脚本应匹配以下主机名。

www-foo-1001-1-49
www-foo-1001-4-37
www-foo-1001-2-12
www-foo-1001-8-4

忽略主机名中的这种模式。

www-foo-1001-1-2-49
www-foo-1001-1-1-49
www-foo-1001-1
www-foo-1001

它必须匹配这个模式1001-N-N并忽略其他任何内容。

我想要执行的更多详细信息if then..并返回exit状态代码以$?抛出与标准主机名不匹配的错误。

答案1

巴什扩展模式在 内启用[[ ... ]];所以你可以做

hosts=( www-foo-1001-1-49 www-foo-1001-4-37 www-foo-1001-2-12 www-foo-1001-8-4 www-foo-1001-1-2-49 www-foo-1001-1-1-49 www-foo-1001-1 www-foo-1001 )
pattern='*-1001-+([[:digit:]])-+([[:digit:]])'
for h in "${hosts[@]}"; do
    if [[ $h == $pattern ]]; then
        echo "OK: $h"
    else
        echo "no: $h"
    fi
done
OK: www-foo-1001-1-49
OK: www-foo-1001-4-37
OK: www-foo-1001-2-12
OK: www-foo-1001-8-4
no: www-foo-1001-1-2-49
no: www-foo-1001-1-1-49
no: www-foo-1001-1
no: www-foo-1001

我的模式从*-1001-我假设你不想匹配的地方开始1100121001

==in 中的运算符是[[ ... ]]模式匹配运算符。

右侧操作数是模式变量,但是未引用的。这允许将变量的值解释为图案不是一个细绳

答案2

使用bash:

$ touch www-foo-1001  www-foo-1001-1  www-foo-1001-1-1-49  www-foo-1001-1-2-49  www-foo-1001-1-49  www-foo-1001-2-12  www-foo-1001-4-37  www-foo-1001-8-4
$ for f in *
do
  [[ $f =~ 1001-[[:digit:]]+-[[:digit:]]+$ ]] && printf 'Yes: %s\n' "$f"
done
Yes: www-foo-1001-1-49
Yes: www-foo-1001-2-12
Yes: www-foo-1001-4-37
Yes: www-foo-1001-8-4

这使用 bash 的正则表达式条件运算符来测试参数:

  • 包含1001-
  • 后面跟着一些数字
  • 随后是一个-
  • 后面跟着一些数字
  • 接下来就没有别的了:$

答案3

kapu@ppc:$ ls
www-foo-1001        www-foo-1001-1-1-49 www-foo-1001-1-49   www-foo-1001-4-37
www-foo-1001-1      www-foo-1001-1-2-49 www-foo-1001-2-12   www-foo-1001-8-4
kapu@ppc:$ ls | awk '/www-foo-1001-[0-9]+-[0-9]+$/{print}'
www-foo-1001-1-49
www-foo-1001-2-12
www-foo-1001-4-37
www-foo-1001-8-4

相关内容