我的主机名如下
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-
我假设你不想匹配的地方开始11001
。21001
==
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