在 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.
的错误状态
我真的很抱歉再次为我的问题打扰你,但我似乎快要结束了。我的目标是创建一个 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.