ファイルの値を置き換えてループを実行し、カール要求を25回実行し、数を1000ずつ増やします。

ファイルの値を置き換えてループを実行し、カール要求を25回実行し、数を1000ずつ増やします。

ファイルのペイロードを使用してサーバーにカール要求を送信するシナリオがあります。ここでは、ファイルの値を変更して値を1000ずつ増やした後、25回繰り返す必要があります。値を「sed」に置き換えることはできますが、25回繰り返すことはできません。これは私が実装したものです。

curl -H "text/xml" --data-binary "@/home/miracle/email/somainput1.xml" https://x.x.x.x:5550 --insecure -u admin:xxxxx >> somaoutput1.xml

私の入力ファイルには次のコードがあります。

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<dp:request domain="HUB" xmlns:dp="http://www.datapower.com/schemas/management">
<dp:b2b-query-metadata>
<dp:query>
<dp:query-condition evaluation="property-equals">
<dp:property-name>ResultCode</dp:property-name>
<dp:value>0</dp:value>
</dp:query-condition>
<dp:query-condition evaluation="logical-and">
<dp:query-condition evaluation="property-greater-than">
<dp:property-name>InputTime</dp:property-name>
<dp:value>2019-02-19 23:00:00</dp:value>
</dp:query-condition>
<dp:query-condition evaluation="property-less-than">
<dp:property-name>InputTime</dp:property-name>
<dp:value>2019-02-20 11:00:00</dp:value>
</dp:query-condition>
</dp:query-condition>
</dp:query>
<dp:result-constraints>
<dp:max-rows>1000</dp:max-rows>
**<dp:start-index>18001</dp:start-index>**
<dp:include-properties>
<dp:property-name>SenderName</dp:property-name>
<dp:property-name>ReceiverName</dp:property-name>
<dp:property-name>ResultCode</dp:property-name>
</dp:include-properties>
</dp:result-constraints>
</dp:b2b-query-metadata>
</dp:request>
</soapenv:Body>
</soapenv:Envelope>

sedを使用して交換できます。

sed -i '23s/18001/19001/g' b2bsoapinput.xml

同じカールリクエストを25回繰り返して送信する必要があります。

ベストアンサー1

繰り返すことができるコマンドは次のとおりです。

sed -n '23s/[^0-9]*\([0-9]*\)[^0-9]*/\1+1000/p' \
b2bsoapinput.xml | bc | xargs -I{} sed -i \
'23s/\([^0-9]*\)[0-9]*\([^0-9]*\)/\1{}\2/g' b2bsoapinput.xml

だからあなたは実行することができます

for i in {1..25}; do
    curl -H "text/xml" --data-binary \
    "@/home/miracle/email/b2bsoapinput.xml" \
    https://x.x.x.x:5550 --insecure -u admin:xxxxx \
    >> somaoutput$i.xml || break
    sed -n '23s/[^0-9]*\([0-9]*\)[^0-9]*/\1+1000/p' 
    b2bsoapinput.xml | bc | xargs -I{} \
    sed -i '23s/\([^0-9]*\)[0-9]*\([^0-9]*\)/\1{}\2/g' \
    b2bsoapinput.xml
done

最初の数字はsed23行の一意の番号と一致してそれを置き換えますnumber+1000.../psedに置き換えられた値を印刷し、-n変更されたファイルを印刷しないように指示します。したがって、bc算術演算のために代替文字列のみがパイプで連結されます。 2番目のsedは、行23の一意の番号を新しい値に置き換え、その場所でファイルを変更します。 xargsを使用して値をsedパラメータにパイプします。-I{}パイプされた値に置き換えられた文字列をに設定します{}

編集する:|| breakループに1つを追加しました。事前設定されたコマンドが失敗すると(ゼロ以外の終了コードを返す)、これはループを「中止」し、プログラムはループの後に続きます。ただし、カールがゼロで終了した場合は、エラー応答を受けてもbreak別の条件で呼び出す必要があります。たぶん同様のものかもしれませんgrep "an error text" somaoutput$i.xml && break

ループの後ではなく次のループ反復でプログラムを実行し続けたい場合は、代わりにcontinue使用できますbreak

おすすめ記事