首页 > 解决方案 > 在 bash elif (FreeNAS) 中组合两个命令

问题描述

我真的很抱歉再次因为我的问题而惹恼你,但我似乎快要结束了。我的目标是创建一个 bash 脚本来检查 IP 地址是否仍然在线或正在进行清理,如果不是,我的系统会关闭。我的脚本,目前正在使用,看起来像这样

#!/bin/bash

hosts=(
  10.10.0.100 #Client 1
  10.10.0.101 #Client 2 
  10.10.0.102 #Client 3 
  10.10.0.103 #Client 4
  10.10.0.104 #Client 5
)

for host in "${hosts[@]}"; do
  if ping -c 1 -i 1 "$host" >/dev/null; then
    echo "No Shutdown - At least one PC ($host) is online"
    exit 0
  fi
done

echo "No PC is online - Shutdown"
bash shutdown -p now

我做了一些研究,发现了以下命令,以检查我的擦洗是否正在进行中

if [ $(zpool status | grep 'scrub in progress') ]; then
    echo "No Shutdown - Scrub in progess"
    exit 0
  fi

但是我在将这两者结合起来时遇到了问题。我希望我的脚本首先检查 IP,如果它们都处于脱机状态,则在关闭机器之前检查是否有清理。因此,两个 if-case 都必须为 false(ips 离线并且清理不在进行中),但它们应该按时间顺序处理,如果第一个 if-case 返回一个在线的 IP,则脚本应该停止。

也许有人可以帮助我?

标签: bashif-statementfreebsd

解决方案


要检查命令输出是否包含字符串,只需:

if zpool status | grep -q 'scrub in progress'; then

[ $(zpool status | grep 'scrub in progress') ]无效。将$( .. )扩展为多个单词并将运行[ scrub in progress ]. 因为in不是 的有效运算符[,所以[将打印一条错误消息并以 退出2。只需检查 grep 的错误状态。


推荐阅读