Bash AWK 或 IF 语句

Bash AWK 或 IF 语句

我正在尝试制作一个脚本来检查变量中的数字然后生成输出。即使用 ping 并基于 tty,检查其运行的是 Linux 还是 Windows。我可能把事情复杂化了,但这就是我得到的:

#!/bin/bash
var1=$(ping $1 -c 1) | awk '{if("$var1"=="128") print "Host is LIVE Running: Windows OS"}'

不产生任何输出。我尝试过使用 IF 语句而不使用 awk,如果我输入一个我知道无法访问的 IP,它不会产生任何输出。

#!/bin/bash
var1=$(ping $1 -c 1)
if [[ "$var1" == *"128"* ]]; then
echo "Host is LIVE Running: Windows OS"
elif [[ "$var1" == *"64"* ]]; then
echo "Host is LIVE Running: Linux OS"
elif [[ "$var1" == *"Unreachable"* ]]; then
echo "Host appears DOWN!"
fi

欢迎建设性批评!谢谢。

答案1

如果awk你想使用环境中的变量,你应该设置它。像这样:

var1=$(ping $1 -c 1) ; awk -v var2=$var1 '{if(var2 == 128)....

bash您比较数字时,您应该使用:

if [[ "$var1" -eq *"128"* ]]; then...

=对于字符串,bash您可以同时使用=and==和 AFAIK,它们的含义相同(在if

答案2

您的脚本不起作用的一些原因:

  1. $var1awk 内部不存在shell 变量
  2. 即使它确实如此,"$var1"在 awk 中并不意味着你认为它的作用 - 它是文字 text $var1,如果没有引号,它将间接指定带有变量值的字段号var1(即,如果 var1 等于 2,则字段 2输入的$2)。 awk 中未初始化的变量的数值为 0,因此这将是 $0 或整个输入行。
  3. $var1在 bash 中将包含命令的整个输出ping,而不仅仅是 ttl 值。
  4. 使用 ICMP Echo Reply 数据包的 TTL 值来确定远程主机的操作系统是一种不可靠的方法。 Windows 并不是唯一使用 TTL 128 的操作系统(也不是所有版本的 Windows 都使用 128)。

答案3

已经搞定了,谢谢支持。这段代码只是有助于第一眼更好地了解它可能是什么操作系统。

#!/bin/bash
var1=$(ping $1 -c 1 -W 3 | grep "64 bytes" | cut -d " " -f 6)
if [[ "$var1" -eq "ttl=63" ]]; then
echo "Host is LIVE! Most likely running: Linux OS"
elif [[ "$var1" -eq "ttl=64" ]]; then
echo "Host is LIVE! Most likely running: Linux OS"
elif [[ "$var1" -eq "ttl=127" ]]; then
echo "Host is LIVE! Most likely running: Windows OS"
elif [[ "$var1" -eq "ttl=128" ]]; then
echo "Host is LIVE! Most likely running: Windows OS"
elif [[ "$var1" -eq "ttl=31" ]]; then
echo "Host is LIVE! Most likely running: Windows 95 OS"
elif [[ "$var1" -eq "ttl=32" ]]; then
echo "Host is LIVE! Most likely running: Windows 95 OS"
elif [[ "$var1" -eq "ttl=255" ]]; then
echo "Host is LIVE! Most likely running: MAC / OPENBSD / CISCO / SOLARIS OS"
elif [[ "$var1" -eq "ttl=254" ]]; then
echo "Host is LIVE! Most likely running: MAC / OPENBSD / CISCO / SOLARIS OS"
elif [[ "$var1" == "" ]]; then
echo "Host appears to be DOWN!"
fi

相关内容