在 bash elif (FreeNAS) 中组合两个命令

Combine two commands in 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 returns 一个在线的 IP 脚本应该停止。

也许有人可以帮助我?

您可以使用!

取消退出状态
if ! ping -c 1 -i 1 "$host" >/dev/null; then
  if ! [[ $(zpool status | grep 'scrub in progress') ]]; then
    echo "No PC is online - Shutdown"
    bash shutdown -p now
  fi
fi

## Add the rest of the script here if both conditions are true.

这基本上意味着两个条件都是假的,这意味着没有主机启动并且没有进行清理,相反没有 !

检查两个条件是否都成立,只需删除 !

if ping -c 1 -i 1 "$host" >/dev/null; then
  if [[ $(zpool status | grep 'scrub in progress') ]]; then
    echo "No Shutdown - At least one PC ($host) is online"
    exit 0
  fi
fi

检查主机是否启动但清理未启动运行。

if ping -c 1 -i 1 "$host" >/dev/null; then
  if ! [[ $(zpool status | grep 'scrub in progress') ]]; then
   ##: Add/run/execute your code here to start scrub.
  fi
fi

如果嵌套是你想要的,那就是这样的。

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
  elif ! ping -c 1 -i 1 "$host" >/dev/null; then
    if ! [[ $(zpool status | grep 'scrub in progress') ]]; then
      echo "No PC is online - Shutdown"
      bash shutdown -p now
    fi
  fi
done

您可以在第一个 if 语句中添加对 zpool 的测试。

    for host in "${hosts[@]}"; do
      if ping -c 1 -i 1 "$host" >/dev/null; then
        if [[ $(zpool status | grep 'scrub in progress') ]]; then
          echo "No Shutdown - At least one PC ($host) is online"
          exit 0
        fi
      fi
      elif ! ping -c 1 -i 1 "$host" >/dev/null; then
        if ! [[ $(zpool status | grep 'scrub in progress') ]]; then
          echo "No PC is online - Shutdown"
          bash shutdown -p now
        fi
      fi
    done

if 语句的第一个示例集应该足够了。 见 help test

对我来说,答案很简单:

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

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

echo "No PC is online and Scrub is not in progress - Shutdown"
shutdown -p now

还是我没抓住重点?

注意代码中的一些更正:删除 if 测试周围的方括号并在关闭前删除 bash。

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

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

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

的错误状态