前言:我上次写“代码”的时间大约是20年前。这是学校里的一些QBasic剧本。 我的ISP严重限制了我的Netflix流量,并且都是douchey,我没有获得全部带宽(我知道这是“尽力而为”,但仍然)。所以我买了一台RPi3,去了谷歌并且疯狂地复制了其他人的代码。
现在我有一个Python脚本(应该是众所周知的)speedtest.py,我有一个bash脚本,它提取相关内容并将其写入MySQL数据库。
# temp file holding output to snip it
user=$USER
if test -z $user; then
user=$USERNAME
fi
log=/tmp/$user/speedtest-mysql.log
# Local functions
str_extract() {
pattern=$1
# Extract
res=`grep "$pattern" $log | sed "s/$pattern//g"`
# Drop trailing ...
res=`echo $res | sed 's/[.][.][.]//g'`
# Trim
res=`echo $res | sed 's/^ *//g' | sed 's/ *$//g'`
echo $res
}
mkdir -p `dirname $log`
# run speedtest
/usr/local/bin/speedtest --share > $log
# parse the output
from=`str_extract "Testing from "`
from_ip=`echo $from | sed 's/.*(//g' | sed 's/).*//g'`
from=`echo $from | sed 's/ (.*//g'`
server=`str_extract "Hosted by "`
server_ping=`echo $server | sed 's/.*: //g'`
server=`echo $server | sed 's/: .*//g'`
server_dist=`echo $server | sed 's/.*\\[//g' | sed 's/\\].*//g'`
server=`echo $server | sed 's/ \\[.*//g'`
download=`str_extract "Download: "`
upload=`str_extract "Upload: "`
share_url=`str_extract "Share results: "`
#create timestamp for database
timestamp=`date +"%Y-%m-%d %H:%M:%S"`
# Send to MySQL
value1=`echo $server_ping | cut -d" " -f1`
value2=`echo $download | cut -d" " -f1`
value3=`echo $upload | cut -d" " -f1`
sql="INSERT INTO $db_table (timestamp,ping,download,upload,server,share_url) VALUES ('$timestamp','$server_ping','$download','$upload','$server','$share_url');"
echo "$sql" | mysql -u$db_user -p$db_passwd -h$db_host $db_name
现在的问题是:有时我从speedtest获得95.53 MBit / s下载和9.93 MBit / s上传的输出,但是我的数据库填充了0.90的上传值。 写入日志文件的speedtest.py的相关输出:
Retrieving speedtest.net configuration...
Testing from UPC Austria (80.110.109.207)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Timewarp IT Consulting GmbH (Vienna) [2.79 km]: 32.403 ms
Testing download speed................................................................................
Download: 17.46 Mbit/s
Testing upload speed................................................................................................
Upload: 2.28 Mbit/s
Share results: http://www.speedtest.net/result/7075502570.png
如上所述:我上次编码的航程早在90年代,我的google-fu未能找到我这个问题的答案。有人可以帮忙吗?
答案 0 :(得分:2)
正如Charles在评论中所说的那样,这个脚本可以改进很多东西。虽然shellcheck.net可以帮助您识别脚本出错的内容,但对策略没有多大帮助。
在我看来,你可以用这样的东西消除许多麻烦:
#!/usr/bin/env bash
IFS=,
a=( $(/usr/local/bin/speedtest.py --csv) )
fmt="INSERT INTO %s (timestamp,ping,download,upload,server)
VALUES ('%s',%.2f,%.2f,%.2f,'%s')"
printf -v sql "$fmt" "${a[4]}" "${a[6]}" "${a[7]}" "${a[8]}" "${a[3]}"
mysql -u"$db_user" -p"$db_passwd" -h"$db_host" -e "$sql" "$db_name"
此解决方案假定speedtest.py
永远不会生成在引用字符串中嵌入逗号的输出。不知道“赞助商”字段是否包含逗号,如果您愿意,可以添加错误检查,甚至可以通过计算字段。
CSV输出已加载到数组$a[]
的字段中,printf
在填充$sql
变量时访问该数组。
您当然会调整格式以满足您的要求。为了便于阅读,上面的脚本使用了一些比它严格需要的变量。
请注意,--csv
和--share
选项似乎是互斥的。