O loop abaixo encontra todos os nós onde o valor é igual a "DOWNLOADING" e captura o valor do nó "bytesdownloaded" correspondente. Eu esperava adlBytesDL1[0]
ser igual 147333120
(do primeiro nó correspondente); em vez disso, é igual 147333120147329024
(node1 e node2 consecutivos). Presumo que estou colocando meu índice no lugar errado, mas não consigo descobrir a que lugar ele pertence. Qualquer ajuda é muito apreciada. Eu tenho que usar XMLSTARLET com XPath 1.0.
for ((i=0; i<=(adlCount-1); i++)); do let "j=$i+1"
adlBytesDL1[$i]=$(xmlstarlet sel -t -m "//DownloadReport/ActionDownload/Downloads/Status[State='DOWNLOADING']" -v ..//BytesDownloaded['"$j"'] outputlive1.txt)
done
Aqui está um trecho do meu arquivo XML:
<?xml version="1.0" encoding="UTF-8"?>
<DownloadReport>
<ActionDownload>
<ActionID>2284879</ActionID>
<State>InProgress</State>
<Error></Error>
<IsActive>true</IsActive>
<Date>Sun, 30 Jun 2024 14:48:39 +0000</Date>
<Downloads>
<DownloadRequestTarget>
<ActionID>2284879</ActionID>
<Index>1</Index>
<Hashes hashAlgorithm="sha1">cefbabced653b2837ccd4bd906841390b1f87227</Hashes>
<Size>1869565324</Size>
<URL>http://servername.com/A13_13.26.9U3.zip</URL>
</DownloadRequestTarget>
<Status>
<State>DOWNLOADING</State>
<Timestamp>Sun, 30 Jun 2024 14:48:39 +0000</Timestamp>
<RetryCount>0</RetryCount>
</Status>
<Available>false</Available>
<BytesDownloaded>147333120</BytesDownloaded>
<TotalBytes>1869565324</TotalBytes>
<RetryLimit>5</RetryLimit>
</Downloads>
<Downloads>
<DownloadRequestTarget>
<ActionID>2284879</ActionID>
<Index>2</Index>
<Hashes hashAlgorithm="sha1">7e90e741c6ffd3476bdbae0262ff5a6aad49b925</Hashes>
<Size>1877973677</Size>
<URL>http://servername.com/A13_13.29.10U0.zip</URL>
</DownloadRequestTarget>
<Status>
<State>DOWNLOADING</State>
<Timestamp>Sun, 30 Jun 2024 14:48:39 +0000</Timestamp>
<RetryCount>0</RetryCount>
</Status>
<Available>false</Available>
<BytesDownloaded>147329024</BytesDownloaded>
<TotalBytes>1877973677</TotalBytes>
<RetryLimit>5</RetryLimit>
</Downloads>
</ActionDownload>
</DownloadReport>
Parece que você só precisa de:
(assumindo que
$IFS
seu valor padrão não foi modificado).O
set -o noglob
objetivo é evitar a vulnerabilidade DoS seBytesDownloaded
não for possível garantir que seja apenas um número. Em qualquer caso, a divisão depende de serem apenas números.Observe
-n
para adicionar uma nova linha após cada valor.Sua abordagem não funciona, pois obtém o j- ésimo
BytesDownloaded
dos correspondentesDownloads
, enquanto você deseja oBytesDownloaded
do j -ésimo correspondenteDownloads
, que deve ser algo como:Você também deixou os
[
,]
que são operadores globais na maioria dos shells, sem aspas.Parece errado em um estilo PoV ter uma mistura de
((...))
elet
. Você poderia ter feito:Mas é bastante ineficiente executar um
xmlstarlet
para cada valor quando você pode obter todos os valores de uma só vez.