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) seq の代わりに、構文 {1..100} または {m...q} を波括弧で囲み、外部引用符なしで、特に 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 に答える