1

我有以下挑战。我正在尝试使用 WebIF 从 Datalogger 读取一些数据,该脚本基本上按预期运行。但我想使用 while 循环添加检查。现在我被困在“for i in & 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"

但我不能让它以这种方式打印数据......

希望你们中的一个有提示!

4

2 回答 2

1

尝试以这种方式回显该行:

    echo "$DEVICENAME input"$i"; $TIME; $VALUE"
于 2012-09-15T14:16:24.003 回答
0

嗯。没有测试自己,只是在眼睛上

1) 您可以在大括号中使用语法 {1..100} 或 {m...q} 代替 seq,而无需外部引号,尤其是 FOR 循环。我刚试过, seq 每一步输出都会生成换行符。

2) 始终将 () 与 "if" 放在一起

3) TRYS 变量用于什么?无论如何,在检查表达式中使用它,始终使用引号,因为如果由于某种原因 TRYS 值将为空,这将生成错误的表达式,因此 [[ "$TRYS" -ne 0 ]] 比 [[ $TRYS -ne 0 ]]

4) 在我看来,curl 调用会生成数字输出之间的换行符,或者在 VALUE 内容中添加换行符,我不会感到惊讶。考虑使用 2>&1 或 2>/dev/null 等流重定向,或从 curl 输出中清除非字母数字字符

5)关于换行符,而不是重复回声,尝试类似 echo -en "aaa\nbbb\n"

6) 对于 bash 中的递增/递减变量,请尝试 $((TRYS++)) 或 $((--TRYS)) 语法

让我知道它是否有帮助:)

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$ 
于 2012-09-15T14:23:06.397 回答