サーバーにデータを送信する簡単なスクリプト

サーバーにデータを送信する簡単なスクリプト

私のbashスクリプトが正しいかどうか尋ねたいです。 1秒ごとにsensors合計10回コ​​マンドの出力を送信したいと思います。

#!/bin/bash
for i in {1..10}
do
a=$(date '+%s')
D=$(sensors)

curl -i -k -X POST -H "Content-Type: application/json" --data '{ "id":2,"timestamp":echo "${a}","data":echo "${D}"}' https://dv7knsjzph.execute-api.eu-central-1.amazonaws.com/prod/boxtronic-devices/2/data/
sleep 1
done

ありがとう

答え1

コマンドを呼び出すときにエコーを使用しないでください。

一重引用符なしで行うことができます。これを行うには、コマンド呼び出しで引用符をエスケープする必要があります。

curl -i -k -X POST -H "Content-Type: application/json" --data "{ \"id\":2,\"timestamp\": \"${a}\",\"data\": \"${D}\"}" https:......

または、単一引用符を使用するには、文字列連結を実行する必要があります。つまり、変数の前の一重引用符を終了して続行します(「誰も」が提案したように:

curl -i -k -X POST -H "Content-Type: application/json" --data '{ "id":2,"timestamp": "'"${a}"'","data": "'"${D}"'"}' https:......

echoを使用する必要がある場合は、呼び出しでechoの出力を使用する必要があります。

curl -i -k -X POST -H "Content-Type: application/json" --data "{ \"id\":2,\"timestamp\": \"$(echo ${a})\",\"data\": \"$(echo ${D})\"}" https:......

答え2

まず、ループ構文が正しくありません。for i in 1 .. 103回実行されます。一度1、一度..、一度10。 1から10までの数字を取得するには、次の手順を実行する必要があります。次に、変数を拡張できるように外部で二重引用符を使用できるように、for i in {1..10}コマンド内に一重引用符を使用します。curlこのような:

#!/bin/bash
for i in {1..10}
do
    a=$(date '+%s')
    D=$(sensors)

    curl -i -k -X POST -H "Content-Type: application/json" \
        --data "{ 'id':2,'timestamp':$a,'data':$D}" https:......
    sleep 1
done

または、タグ名と引用する値が必要な場合は、次を使用してください。

#!/bin/bash
for i in {1..10}
do
    a=$(date '+%s')
    D=$(sensors)

    curl -i -k -X POST -H "Content-Type: application/json" \
        --data "{ 'id':'2','timestamp':'$a','data':'$D'}" https:......
    sleep 1
done

関連情報