我遇到了以下挑战。我正在尝试从带有WebIF的数据记录器中读取一些数据,该脚本基本上按预期运行。但我想使用while循环添加一个检查。而现在,我仍然坚持“为了我而在& while”组合......
#!/bin/bash
PASSWD=blah
OUTFILE=$(date +%d).csv
OUTPATH=$(date +%Y/%m/)
LOGPATH="./test/log/"
BASEPATH="./test/"
DEVICENAME=wc-s0
NETWORK=somewhere.lan
CURLPARA="-silent --connect-timeout 5"
TRYS=3
for i in {0..5};
do
TIME="$(date +"%Y-%m-%d %H:%M:%S")";
while [[ $TRYS -ne 0 ]] ; do
VALUE=$(curl $CURLPARA "http://"$DEVICENAME"."$NETWORK"/counter?PW="$PASSWD"&"|grep counter|cut -sd ";" -f $(( i+2 ))|sed 's#kWh##g'|sed 's#kVARh##g'|sed 's#,#.#g');
rc=$?
if [[ $rc -eq 0 ]] ; then
TRYS=1
fi
((TRYS = TRYS - 1))
done
if [[ $rc -eq 0 ]] ; then
echo "Read $DEVICENAME input"$i"."
else
echo "Timeout while reading $DEVICENAME input"$i"."
fi
echo "$VALUE"
echo -n "$DEVICENAME input"$i"; "
echo "$TIME; "
done
输出结果如下:
Read wc-s0 input0.
wc-s0 input0; 2012-09-15 16:58:34;
Read wc-s0 input1.
wc-s0 input1; 2012-09-15 16:58:38;
Read wc-s0 input2.
wc-s0 input2; 2012-09-15 16:58:38;
Read wc-s0 input3.
wc-s0 input3; 2012-09-15 16:58:38;
Read wc-s0 input4.
wc-s0 input4; 2012-09-15 16:58:38;
Read wc-s0 input5.
wc-s0 input5; 2012-09-15 16:58:38;
“0.560”是一个$ VALUE,但我希望它是这样的:
Read wc-s0 input0.
wc-s0 input0; 2012-09-15 15:58:36; 0.560
Read wc-s0 input1.
wc-s0 input1; 2012-09-15 15:58:37; "$VALUE2"
但我无法以这种方式打印数据......
希望你们中的一个人有一个提示!
答案 0 :(得分:1)
尝试以这种方式回应这条线:
echo "$DEVICENAME input"$i"; $TIME; $VALUE"
答案 1 :(得分:0)
嗯。没有测试自己,只是在眼睛上
1)您可以在大括号中使用语法{1..100}或{m ... q},而不使用外部引号,尤其是FOR循环,而不是seq。我刚试过,seq会在每个步骤输出时生成换行符。
2)总是把()用“if”
3)什么是TRYS变量用于?无论如何,在check表达式中使用它,使用引号ALWAYS,因为如果由于某种原因TRYS值将为空,这将产生错误的表达式,因此[[“$ TRYS”-ne 0]]优于[[$ TRYS -ne 0] ]
4)在我看来,我不会感到惊讶的是,curl调用会生成行间数字输出,或者为VALUE内容添加换行符。考虑使用流重定向,如2>& 1或2> / dev / null等,或清除curl输出中的非字母数字字符
5)关于换行,而不是重复回声,尝试回声-en“aaa \ nbbb \ n”
之类的东西6)对于bash中的递增/递减变量,请尝试$((TRYS ++))或$(( - TRYS))syntaxl
如果有帮助,请告诉我:)。
dtpwmbp:~ pwadas$ seq 0 5
0
1
2
3
4
5
dtpwmbp:~ pwadas$ for i in {0..5} ; do echo -n $i; done ; echo
012345
dtpwmbp:~ pwadas$ for i in {0..5} ; do echo -n "$i "; done ; echo ;
0 1 2 3 4 5
dtpwmbp:~ pwadas$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
dtpwmbp:~ pwadas$