通过替换文件中的值进行循环,然后执行 curl 请求 25 次,计数增加 1000

通过替换文件中的值进行循环,然后执行 curl 请求 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

我需要循环并发送相同的curl 请求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

第一个sed匹配第 23 行中的唯一数字并将其替换为number+1000。告诉.../psed 打印替换的值并-n告诉它不打印更改的文件。因此,只有替换字符串通过管道传输到bc其中进行算术运算。第二个 sed 将第 23 行中的唯一数字替换为新值,并就地更改文件。我使用 xargs 将管道值放入 sed 参数中。将-I{}被管道传输值替换的字符串设置为{}

编辑:|| break在循环中添加了一个。如果预置命令失败(返回非 0 的退出代码),这会导致循环“停止”,并且程序在循环后继续。但是,如果 curl 确实以 0 退出,即使它收到错误响应,您也需要break在另一个条件下调用。也许类似的东西grep "an error text" somaoutput$i.xml && break

如果您希望程序继续执行循环的下一次迭代而不是在循环之后,您可以使用continue代替break

答案2

像这样做,它的基本循环

#!/bin/bash

for i in {1..25}; do
        # put the code you want to loop 25 times here
done

或者单线:

$ for i in {1..25}; do #your code here ; done

要增加值并替换它们,请尝试以下操作:

!/bin/bash 

counter=1 
for i in {1..25}; do    
         # Send CURL request    
         curl -H "text/xml" --data-binary \     
         "@/home/miracle/email/b2bsoapinput.xml" \  
         https://x.x.x.x:5550 --insecure -u admin:xxxxx \   
         >> somaoutput$i.xml    

         # inc_counter will hold values 1000 bigger than counter    
         # we will replace value of counter with inc_counter in text file   
         inc_counter=$(expr $counter + 1000)    

         # replace values   
         sed -i "23s/$counter/$inc_counter/g" b2soapinput.xml   

         # Increment counter by 1000    
         let "counter+=1000" 
done

相关内容