파일의 값을 교체하여 루프를 수행한 다음 컬 요청을 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산술 연산을 위해 대체 문자열만 파이프로 연결됩니다 . 두 번째 sed는 23행의 고유 번호를 새 값으로 바꾸고 해당 위치에서 파일을 변경합니다. xargs를 사용하여 값을 sed 매개변수로 파이프합니다. -I{}파이프된 값으로 대체된 문자열을 로 설정합니다 {}.

편집하다:|| break루프에 하나를 추가했습니다 . 사전 설정된 명령이 실패하면(0이 아닌 종료 코드를 반환) 이로 인해 루프가 "중지"되고 프로그램은 루프 이후에 계속됩니다. 그러나 컬이 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

관련 정보