Bash 检查linux客户端是否通过dhcp获取IP

Bash 检查linux客户端是否通过dhcp获取IP,bash,if-statement,redirect,Bash,If Statement,Redirect,我有下面的代码,我试图检查机器是否从dhcp获取IP地址,或者它是否是静态的。代码必须同时适用于ubuntu和sles 12。现在,如果我在sles上使用代码,我会得到一个错误,文件找不到,这是正常的。但我不希望用户看到此消息。有没有办法重定向if语句的输出?正常的重定向似乎不起作用 我已经试过在if语句之后放置if[[${statement}]]&>/dev/null,但这并没有改变什么 if[[!”$(grep“dhcp4:true)/etc/netplan/50-cloud-init.ya

我有下面的代码,我试图检查机器是否从dhcp获取IP地址,或者它是否是静态的。代码必须同时适用于ubuntu和sles 12。现在,如果我在sles上使用代码,我会得到一个错误,文件找不到,这是正常的。但我不希望用户看到此消息。有没有办法重定向if语句的输出?正常的重定向似乎不起作用

我已经试过在if语句之后放置
if[[${statement}]]&>/dev/null
,但这并没有改变什么

if[[!”$(grep“dhcp4:true)/etc/netplan/50-cloud-init.yaml | awk'{print$2}')”==“true”]|[!”$(grep'BOOTPROTO'/etc/sysconfig/network/ifcfg-eth0 | cut d'=-f2 | sed“s/'//g”| xargs)==“dhcp”]
然后
#更多代码。。。
fi
如果有人有更好的解决方案来检查客户端是否通过dhcp获得IP,如果您让我知道,我将不胜感激

所以我尝试了一种新的方法,但我对它不是很满意。该方法如下所示:

if[${osname1}==“Ubuntu”]]
然后
语句=“$(grep'dhcp4:true'/etc/netplan/50-cloud-init.yaml | awk'{print$2})”
matchword=“true”
其他的
语句=“$(grep'BOOTPROTO'/etc/sysconfig/network/ifcfg-eth0 | cut-d'='-f2 | sed“s/'//g”| xargs)”
matchword=“dhcp”
fi
如果[[!${statement}=${matchword}]]
然后
#更多声明
fi

与您的第二个代码理念合作

if [[ ${osname1} == "Ubuntu" ]] ; then
    if awk 'BEGIN{fnd=1};/dhcp4: true/{fnd=0} ; END{exit fnd}' /etc/netplan/50-cloud-init.yaml  ; then
       # we're setting the shell return value for fnd, so it's fnd=1 indicates error, 0 indicates success
           matchword="true"
        fi
    else
        # statement="$(grep 'BOOTPROTO' /etc/sysconfig/network/ifcfg-eth0 | cut -d '=' -f2 | sed "s/'//g" | xargs)"
        if awk 'BEGIN{fnd=1};/BOOTPROTO/{fnd=0);END{exit fnd}' /etc/sysconfig/network/ifcfg-eth0]] ;then
            matchword="dhcp"
    fi
fi

if [[ ${matchword} == "dncp" ]]
then
  # dhcp stuff statements
elif [[ ${matchword] = "true" ]] ; then
   # true stuff staments
else
   echo "Found value for matchword="XX${matchword}ZZ", can't continue"
   exit 1
fi
我将使用
case
语句作为最后一个块

请注意,在测试被调用程序的返回值时,我们不需要
[…]]
对,因此是
awk'END{exit retVal}'
类型的代码

-------编辑-------

由于我们仅仅依赖于在某个文件中找到某个术语,并且没有以任何方式解析输出,因此可以通过将
awk
脚本替换为简单的
grep-q
来进一步简化

if [[ ${osname1} == "Ubuntu" ]] ; then
    if grep -q 'dhcp4: true' /etc/netplan/50-cloud-init.yaml  ; then
       # grep returns true if it finds the search target in the supplied filelist
           matchword="true"
        fi
    else
        if grep -q 'BOOTPROTO' /etc/sysconfig/network/ifcfg-eth0 ;then
            matchword="dhcp"
    fi
fi
-----------结束编辑---------

未经测试,因为我没有这些操作系统或文件及其内容可用

嗯,我还有一条评论要说,但是清理我的代码让我分心。当我想到它时,我会在下面加上它作为评论


IHTH

您的Q可能会出现重复的卓越改进!我们可以删除现在的外部评论。祝你好运。对于初学者来说,如果[[..]]&>/dev/null可以捕获任何输出,我不认为
(尽管我认为这可能是个好主意)。您需要重定向单个程序的输出,或者如果您喜欢的话,重定向类似于
{echo stdout;echo stderr>&2;}&>/dev/null
的分组的输出。我更喜欢使用“老式”重定向,因此
{echo stdout;echo stderr>&2;}>/dev/null 2>&1
是等效的。因此,您需要类似于
grep'srchStr'/path/to/file 2>/dev/null的内容|更多内容
。请注意,
&>
也会将stdout发送到
/dev/null
我认为您的第二个想法/代码块更容易理解您的目标是什么,并且在您获得提升后,其他人也更容易维护;-)。但那种情况相当折磨人。没有任何程序调用的尾随
xargs
可能是可用的,但这不是传统用法。您需要在代码中的注释中解释这一点。但是陛下请参阅下面我的答案。@Sheller感谢您的反馈。我删除了xargs,因为它不是真的需要。我不记得为什么我在命令中使用了它自从我接触这个脚本已经有一段时间了,但是我现在必须维护它,以便它也能在其他发行版上工作。我真的很感谢你的帮助@劳伦斯:谢谢你的“信任票”。我还做了一些修改,以后可能还要补充一点意见。很高兴这有帮助。用你修改过的Q作为你发布的未来Q的模型,你会得到一些很好的帮助。祝你好运。谢谢你花时间帮忙!你让世界变得更美好。我会记住这一点。祝你好运。@laurentere:做了另一个重要的编辑,你可能想签出。