2016-06-07 43 views
-1

我想提出一个脚本,可以做几台机器相同的任务,像这样:猛砸模式内匹配[试块

#!/bin/bash 
if [[ hostname = login.machine1 ]]; then 
    #do things how they are done on machine1 
    ... 
elif [[ hostname = login.machine2 ]]; then 
    #etc. 
fi 

问题:有些机器有几个登录节点,就像login1.machine2login2.machine2,等我都试过壳模式匹配和正则表达式,但他们没有工作:

if [[ hostname = login?.machine2 ]] 
if [[ hostname == login?.machine2 ]] 
if [[ hostname =~ login[0-9].machine2 ]] 
if [[ hostname =~ login[0-9]\.machine2 ]] 

,并至少有十几个类似的图案,带有或不带引号等什么是做一个测试,将返回正确的方式如果hostname = login1.machine2或login2.machine2,则为true TC?积分可与[配合使用,而不是[[

+0

我建议使用变量'$ HOSTNAME'或out放命令主机名:'$(主机名)'。 – Cyrus

+0

我不知道你使用的是什么样的shell。但在bash中'if [[$(hostname)= login?.machine2]]'这将检查主机名是否等于字符串“login?.machine2” – naab

回答

0

命令hostname需求被包裹:

if [[ $(hostname) = login?.machine2 ]] 
3

您需要一个$之前的主机名才能使用该变量。

if [[ $hostname =~ login[0-9]\.machine2 ]]; then 
    echo "ok" 
fi 

而对于单[(SH),正则表达式运算符=~在bash的加入,所以它不应该是可能的SH做它本身。

+0

这应该是命令'hostname',而不是变量。一旦我用'$(主机名)替换它'我的第一次尝试与纯shell模式匹配工作,不需要正则表达式。成功! –

0

[[ hostname =~ ... ]]应该调用命令hostname还是你有一个变量hostname?无论是使用$HOSTNAME或命令替换$(hostname)

如果关心可移植性AWK可以使用,与老同学命令替换:

if printf "%s\n" "`hostname`" | awk '!/login[[:digit:]]\.machine2/{exit 1}'; then 
    printf "Matches...\n" 
else 
    printf "Doesn't match\n" 
fi 

如果不是我会强烈建议the answer by naab