我正在尝试编写一个脚本来测试我的 VPN 是否已连接。运行时,脚本目前仅回显 VPN 状态。最终,我希望脚本能够做更多的事情,但目前,我正在尝试解决测试问题,这让我很头疼。无论 VPN 处于何种状态,脚本始终报告为“未连接”。
我用来检查状态的命令是,nordvpn status
但它输出的信息比我想要的多,所以我 grep 出报告其连接状态的行。这是nordvpn status
连接时的原始输出。
You are connected to NordVPN.
Current server: us1681.nordvpn.com
Your new IP: xxx.xxx.200.1xx
Current protocol: UDP
Transfer: 1.7 MB received, 500.5 KB sent
nordvpn status
这是我没有连接时的输出。
You are not connected to NordVPN.
脚本如下:
#!/usr/bin/env bash
NORDSTAT1="$(nordvpn status | grep connected)"
if [ "$NORDSTAT1 = 'You are not connected to NordVPN.'" ]; then
echo Not Connected
else
echo Connected
fi
如果我在脚本中添加一行echo $NORDSTAT1
,则表明连接状态已正确存储在变量中。此外,我已确认我正在测试的字符串与来自的 grep 行完全匹配nordvpn status
。
任何帮助将不胜感激。
答案1
脚本中的引用是错误的。行中的表达式
if [ "$NORDSTAT1 = 'You are not connected to NordVPN.'" ]; then
是一完整的字符串被插入(变量解析)到
if [ "You are not connected to NordVPN. = 'You are not connected to NordVPN.'" ]; then
这只是检查该字符串是否为非空。你想要
if [ "$NORDSTAT1" = "You are not connected to NordVPN." ]; then
而是测试二字符串。
测试也可以用 重写grep -q
。它测试模式的存在无需打印。相反,结果可以从
grep
返回码(0
用于成立以及!=0
未找到)。在这种情况下,测试必须稍微改变一下:
#!/usr/bin/env bash
if nordvpn status | grep -q "not connected"; then
echo "Not Connected" # the string "not connected" is contained in the output
else
echo "Connected" # ... is not contained
fi
不过,我认为在这种情况下这只是一个品味问题。