猛砸模式内匹配[试块
问题描述:
我想提出一个脚本,可以做几台机器相同的任务,像这样:猛砸模式内匹配[试块
#!/bin/bash
if [[ hostname = login.machine1 ]]; then
#do things how they are done on machine1
...
elif [[ hostname = login.machine2 ]]; then
#etc.
fi
问题:有些机器有几个登录节点,就像login1.machine2
,login2.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?积分可与[
配合使用,而不是[[
。
答
命令hostname
需求被包裹:
if [[ $(hostname) = login?.machine2 ]]
答
您需要一个$之前的主机名才能使用该变量。
if [[ $hostname =~ login[0-9]\.machine2 ]]; then
echo "ok"
fi
而对于单[
(SH),正则表达式运算符=~
在bash的加入,所以它不应该是可能的SH做它本身。
+0
这应该是命令'hostname',而不是变量。一旦我用'$(主机名)替换它'我的第一次尝试与纯shell模式匹配工作,不需要正则表达式。成功! –
答
是[[ 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
我建议使用变量'$ HOSTNAME'或out放命令主机名:'$(主机名)'。 – Cyrus
我不知道你使用的是什么样的shell。但在bash中'if [[$(hostname)= login?.machine2]]'这将检查主机名是否等于字符串“login?.machine2” – naab