arrays - 如何操作字符串和前导零
问题描述
在我解释这个问题之前,我必须对此做一些澄清。
我正在为我的 dd-wrt 路由器更改一个 vpn 脚本。请注意,这个路由器没有 bash,所以我通过 entware 安装了它,就像 sed grep cut 等所有命令一样。
现在,我的脚本调用另一个脚本并从中收集数据。被调用脚本的输出是
./nordvpn-server-find -l fr
Looking for servers located in FR with current capacity lower than 30%...
fr27.nordvpn.com 9%
fr104.nordvpn.com 10%
fr169.nordvpn.com 10%
fr25.nordvpn.com 10%
fr37.nordvpn.com 10%
fr80.nordvpn.com 11%
fr98.nordvpn.com 11%
fr114.nordvpn.com 12%
fr127.nordvpn.com 13%
fr16.nordvpn.com 13%
fr133.nordvpn.com 14%
fr41.nordvpn.com 14%
fr50.nordvpn.com 14%
fr62.nordvpn.com 14%
fr67.nordvpn.com 14%
fr19.nordvpn.com 15%
fr30.nordvpn.com 15%
fr31.nordvpn.com 15%
fr46.nordvpn.com 15%
fr84.nordvpn.com 15%
如您所见,是当前负载的服务器列表,此列表按列格式化,因此在我的脚本中,我使用此命令仅获取该列表的前 3 个服务器
declare -a SERVERDIRS # declare an array
SERVERDIRS+=($($COMMANDSPATH/bash $JFFSPATH/nordvpn-server-find -l it \
| $COMMANDSPATH/head -6 | $COMMANDSPATH/tail -3 | $COMMANDSPATH/awk '{print $1}'))
echo
echo ${SERVERDIRS[*]} # echo all the elements of the array
echo "number of element in array" ${#SERVERDIRS[@]}
echo "first element in array" ${SERVERDIRS[0]}
echo "last element in array" ${SERVERDIRS[${#SERVERDIRS[@]}-1]}
请注意 $COMMANDSPATH 和 $JFFSPATH 是我指向正确位置的路径变量。如您所见,如果我没记错的话,我将前 3 个服务器放入一个数组中,然后我可以对其进行操作,这里是关于数组创建的输出
#vpn rnd
fr27.nordvpn.com fr104.nordvpn.com fr169.nordvpn.com
number of element in array 3
first element in array fr27.nordvpn.com
last element in array fr169.nordvpn.com
现在看起来一切都很好,数组是 3 个元素,依此类推
所以我的期望是提取第一个“。”之前的所有数据。然后将其格式化为 4 位数字,例如 fr27.nordvpn.com -> 必须变为 -> fr0027 等等。
所以我尝试了这种方法 https://repl.it/@jorman/JovialAngryWebpages 确实有效,在 repl.it 但我不知道为什么,在 bash 上不行!查看此解决方案的输出
vpn rnd
first var
econd var 36
1
80
third var
irst var
econd var 36
1
129
third var
irst var
econd var 36
1
37
third var
似乎有一个奇怪的错误,缺少 char "irst" 而不是 first 和 other,所以我在调试模式下运行它,查看日志
+ declare -a SERVERDIRS
+ SERVERDIRS+=($($COMMANDSPATH/bash $JFFSPATH/nordvpn-server-find -l fr | $COMMANDSPATH/head -6 | $COMMANDSPATH/tail -3 | $COMMANDSPATH/awk '{print $1}'))
++ /opt/bin/head -6
++ /opt/bin/bash /jffs//nordvpn-server-find -l fr
++ /opt/bin/tail -3
++ /opt/bin/awk '{print $1}'
+ for i in "${SERVERDIRS[@]}"
++ /opt/bin/sed 's/\..*//'
++ echo 'fr188.nordvpn.com'
++ /opt/bin/cut -c1-2
+ aaa='
pt/bin/sed 's/\..*//'
++ echo 'fr188.nordvpn.com'
++ /opt/bin/grep -oP '\d+'
+ bbb='36
1
188'
++ printf %04d 36 1 188
+ bbbmod=003600010188
+ ccc='
cho 'first var
irst var
cho 'second var 36
1
188'
second var 36
1
188
+ echo 'third var
hird var
cho
+ for i in "${SERVERDIRS[@]}"
++ echo 'fr193.nordvpn.com'
++ /opt/bin/cut -c1-2
++ /opt/bin/sed 's/\..*//'
+ aaa='
pt/bin/sed 's/\..*//'
++ /opt/bin/grep -oP '\d+'
++ echo 'fr193.nordvpn.com'
+ bbb='36
1
193'
++ printf %04d 36 1 193
+ bbbmod=003600010193
+ ccc='
cho 'first var
irst var
cho 'second var 36
1
193'
second var 36
1
193
+ echo 'third var
hird var
cho
+ for i in "${SERVERDIRS[@]}"
++ echo 'fr194.nordvpn.com'
++ /opt/bin/sed 's/\..*//'
++ /opt/bin/cut -c1-2
+ aaa='
cho 'fr194.nordvpn.com'
++ /opt/bin/grep -oP '\d+'
++ /opt/bin/sed 's/\..*//'
+ bbb='36
1
194'
++ printf %04d 36 1 194
+ bbbmod=003600010194
+ ccc='
cho 'first var
irst var
cho 'second var 36
1
194'
second var 36
1
194
+ echo 'third var
hird var
cho
+ echo
+ echo 'fr188.nordvpn.com' 'fr193.nordvpn.com' 'fr194.nordvpn.com'
fr188.nordvpn.com fr193.nordvpn.com fr194.nordvpn.com
+ echo 'number of element in array' 3
number of element in array 3
+ echo 'first element in array' 'fr188.nordvpn.com'
first element in array fr188.nordvpn.com
+ echo 'last element in array' 'fr194.nordvpn.com'
last element in array fr194.nordvpn.com
+ echo
+ echo 'fr188.nordvpn.com'
+ /opt/bin/sed 's/\..*//'
+ /opt/bin/sed 's/[^0-9]*//g'
361188
+ exit
如果您注意到 3、6 和 1 似乎来自代码
++ /opt/bin/head -6
++ /opt/bin/bash /jffs//nordvpn-server-find -l fr
++ /opt/bin/tail -3
++ /opt/bin/awk '{print $1}'
我无法解释发生了什么。
我错过了一些代码?有更好的方法从数组中提取信息,我需要数组吗?
解决方案
我阅读了一些我将在这个小脚本中实现的好代码。
但我发现了问题:查看日志和调试,我看到这样的代码
[\033
在我的脑海中,我确信我已经看到了!
返回服务器的nordvpn脚本加载,用tput写入输出,所以输出是彩色的!碰巧所有这些信息都跳到代码中,当所有逻辑都切掉 grep 并解析所有信息时,“颜色代码”仍然存在并有所作为!
所以我禁用了彩色输出,所有的工作都像一个魅力!
推荐阅读
- c++ - 你如何:填充和排序新填充的向量?
- powershell - 无法在 Visual Studio Code 中调试 PowerShell 脚本
- c# - C# int 和非英语数字
- c# - 如何避免仅用于依赖注入的未使用字段?
- ios - 重命名 Firebase Analytics 日志事件
- javascript - 使用 ml5 和 faceApi 检测人脸
- javascript - 用css制作一个复杂的形状,比如八角形
- c# - 存储在 Azure Blob 中的图像不会缓存在浏览器中
- vba - 仅在 y 轴上创建包含数据的图表线
- rust - Rust impl Trait 作为函数返回类型