私の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 .. 10
3回実行されます。一度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