当我在 CentOS 的 SSH 终端中使用以下代码时,它工作正常:
paste <(printf "%s\n" "TOP")
Run Code Online (Sandbox Code Playgroud)
但是,如果我将相同的行代码放在 shell 脚本(test.sh)中并从终端运行 shell 脚本,它会抛出错误,如下所示
./test.sh: line 30: syntax error near unexpected token ('
./test.sh: line 30: paste <(printf "%s\n" "TOP")
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
#!/bin/bash
MAXCDN_ARRAY="108.161.176.0/20 94.46.144.0/20 146.88.128.0/20 198.232.124.0/22 23.111.8.0/22 217.22.28.0/22 64.125.76.64/27 64.125.76.96/27 64.125.78.96/27 64.125.78.192/27 64.125.78.224/27 64.125.102.32/27 64.125.102.64/27 64.125.102.96/27 94.31.27.64/27 94.31.33.128/27 94.31.33.160/27 94.31.33.192/27 94.31.56.160/27 177.54.148.0/24 185.18.207.65/26 50.31.249.224/27 50.31.251.32/28 119.81.42.192/27 119.81.104.96/28 119.81.67.8/29 119.81.0.104/30 119.81.1.144/30 27.50.77.226/32 27.50.79.130/32 119.81.131.130/32 119.81.131.131/32 216.12.211.59/32 216.12.211.60/32 37.58.110.67/32 37.58.110.68/32 158.85.206.228/32 158.85.206.231/32 174.36.204.195/32 174.36.204.196/32"
$IP = 108.161.184.123
if [ $IP in $MAXCDN_ARRAY ];
then:
echo "$IP is in MAXCDN range"
else:
echo "$IP is not in MAXCDN range"
fi
Run Code Online (Sandbox Code Playgroud)
我有一个MAXCDN_ARRAY用作白名单的 IP 列表。我想检查一个特定的 IP 地址是否在这个数组的范围内。
如何构建代码以便它可以比较数组中的所有 IP 并说出此列表范围内的特定 IP?
我有以下脚本,可以获取黑名单中某些 IP 的详细信息。
检查.sh
blacklist_ips='
5.56.148.140
94.73.159.66
113.171.224.169
107.150.42.226
195.159.233.44
89.19.7.58
'
for ipx in $blacklist_ips
do
country=`whois $ipx | grep -i country | tail -1 | awk '{print $2}'`
hostx=`host $ipx |awk '{print $NF}'|sed "s/\.$//"`
printf '%s %s %s' $country $ipx $hostx
printf '\n'
done
Run Code Online (Sandbox Code Playgroud)
它有效,但我想按国家/地区部分对输出进行排序。
现在我可以简单地去:
bash check.sh | sort -nr
Run Code Online (Sandbox Code Playgroud)
它工作正常。
但我想在将结果发送到终端之前进行排序。换句话说,排序应该在内部完成check.sh,然后应该发送到终端。
如何在 bash 脚本中实现这一点?
blacklist_ips='
5.56.148.140
94.73.159.66
69.134.15.72
107.150.42.226
195.159.233.44
89.19.7.58
'
for ipx in $blacklist_ips
do
country=`whois $ipx | grep -i country | tail -1 | awk '{print $2}'`
hostx=`host $ipx |awk '{print $NF}'|sed "s/\.$//"`
printf '%s %s %s' $country $ipx $hostx
printf '\n'
done
Run Code Online (Sandbox Code Playgroud)
脚本适用于所有 IP,但对于69.134.15.72,
country=`whois $ipx | grep -i country | tail -1 | awk '{print $2}'`
Run Code Online (Sandbox Code Playgroud)
结果如下:
connect: Connection refused
Run Code Online (Sandbox Code Playgroud)
这是因为
whois 69.134.15.72
Run Code Online (Sandbox Code Playgroud)
似乎69.134.15.72没有正确响应。
我不明白为什么它停在第 1 行country并且脚本执行没有到达下一行。
如何检测connection refused错误并做出正确反应?
我有一个ip.txt包含 IP 地址的 txt ( ) 文件。我将它们分组在 TCP 和 UDP 下。文件摘录如下:
#TCP
162.298.38.930
162.298.38.931
162.298.38.932
#UDP
162.298.38.930
162.298.38.931
162.298.38.932
Run Code Online (Sandbox Code Playgroud)
我有一个特定的 IP ( 162.298.38.929) 通过 bash 脚本将两者添加到 TCP 和 UDP 行下的这个 ip.txt 中,所以它应该是这样的。
#TCP
162.298.38.929
162.298.38.930
162.298.38.931
162.298.38.932
#UDP
162.298.38.929
162.298.38.930
162.298.38.931
162.298.38.932
Run Code Online (Sandbox Code Playgroud)
如何在 bash 脚本中实现这一点?行号不适用于我的情况,因为 #TCP 和 #UDP 行号可以更改,因为我在文件中添加了大量注释。Bash 脚本应该在 TCP 和 UDP 下搜索并添加 IP。
的输出w | head -1可以为我的机器提供 2 个不同的结果:
16:34:42 up 32 days, 3:02, 1 user, load average: 0.14, 0.11, 0.07
14:10:55 up 32 days, 39 min, 1 user, load average: 0.07, 0.13, 0.09
Run Code Online (Sandbox Code Playgroud)
我需要获得负载平均数(例如0.07, 0.13, 0.09)。如何按load average:字符串拆分行,以便始终可以获得两种情况的平均负载数?