web-dev-qa-db-fra.com

Incrémenter avec bash

Je suis coincé à essayer d'incrémenter une variable dans un fichier .xml. La balise peut être dans un fichier 100 fois ou seulement deux fois. J'essaie d'ajouter une valeur qui augmentera le montant plusieurs fois. J'ai inclus un exemple de code sur lequel je travaille, mais lorsque j'exécute le script, il n'en place qu'un seul et n'incrémente pas davantage. Des conseils seraient excellents sur ce que je fais mal.

for xmlfile in $(find $DIRECTORY -type f -name \*.xml); do
  TFILE="/tmp/$directoryname.$$"
  FROM='><process>'
  TO=' value\=""><process>'
  i=0
  while [ $i -lt 10 ]; do
    i=`expr $i + 1`
    FROM='value\=""'
    TO='value\="'$i'"'
  done
  sed "s/$FROM/$TO/g" "$xmlfile" > $TFILE && mv $TFILE "$xmlfile"
done

La boucle while est quelque chose que je viens de placer pour tester le code. Il insérera le <process> mais il n'insérera pas l'incrément.

Mon objectif final:

<process>value="1"</process>
<process>value="2"</process>
<process>value="3"</process>
<process>value="4"</process>

Et ainsi de suite tant que <process> est présent dans le fichier dont il a besoin pour incrémenter.

20

Pour un incrément correct dans bash, utilisez une boucle for (style C):

n=10
for ((i=1; i<=n; i++)) {
    printf '<process>value="%d"</process>\n' $i
}

SORTIE

<process>value="1"</process>
<process>value="2"</process>
<process>value="3"</process>
<process>value="4"</process>
<process>value="5"</process>
<process>value="6"</process>
<process>value="7"</process>
<process>value="8"</process>
<process>value="9"</process>
<process>value="10"</process>

NOTE

expr est un programme utilisé dans l'ancien code Shell pour faire des mathématiques. Dans les shells Posix comme bash, utilisez $ ((expression)). Dans bash et ksh93, vous pouvez également utiliser (( expression )) ou let expression si vous n'avez pas besoin d'utiliser le résultat dans une extension.

MODIFIER

Si j'ai mal compris vos besoins et que vous avez un fichier avec des valeurs vides comme ceci:

<process>value=""</process>

essaye ça :

$ Perl -i -pe '$c++; s/<process>value=""/<process>value"$c"/g' file.xml
<process>value"1"</process>
<process>value"2"</process>
<process>value"3"</process>
<process>value"4"</process>
<process>value"5"</process>
<process>value"6"</process>
<process>value"7"</process>

-i changez le fichier pour de vrai, alors faites attention.

20
Gilles Quenot

Je viens de tester votre code et il semble incrémenter correctement i.

Vous pouvez essayer de changer votre syntaxe d'incrémentation de:

i=`expr $i + 1`

À

i=$((i+1))
32
sampson-chen

C'est la manière la plus simple d'incrémenter une variable dans bash:

i=0
((i++))
11
Cory Klein

Cela fonctionne également.

Déclaration de la variable sous forme d'entier.

declare -i i=0

Ensuite, vous pouvez incrémenter comme suit:

i+=1
1
dskrad

Utilisez awk:

awk '{gsub( "value=\"\"", "value=" i++ ); print }' i=1 input-file

Cela remplacera la chaîne value="" avec value="1", value="2", etc. Vous pouvez facilement modifier la valeur de départ et l'incrément (par exemple ..."value=" i ); i+=5; print)

1
William Pursell