Forum Programmation.shell Pbm de syntaxe d'opérateur mathématique shell script opensuse

Posté par  .
Étiquettes :
0
8
mai
2007
Bonjour, je souhaite faire un script de sauvgarde pour firebird qui nécessite une ligne de commande par fichier (pas de traitement grouper).
Et je block sur un opérateur mathématique...

Voici tout mon code:

#!/bin/bash

#définition du repetoire de stockage des fichiers FDB
directory=/usr/local/Novaprout


#Creation du rep DUPLIQUEE si il n'existe pas
if
test -d $directory/DUPLIQUEE

then
echo "le repertoire existe passage a l'etape suivante"
rm -f $directory/DUPLIQUEE/*.FBK
else
mkdir $directory/DUPLIQUEE
echo "Repertoire cree"
fi





#Comptage du nombre de fichier FDB
nbfichier=`ls $directory/*.FDB -1 | wc -l | bc `
echo $nbfichier

#test de l'existance de NOVAXEL.FDB
if
test -f $directory/NOVAXEL.FDB
then
echo "le fichier NOVAXEL.FDB existe"
/opt/firebird/bin/gbak -B -V -L $directory/NOVAXEL.FDB $directory/DUPLIQUEE/NOVAXEL.FBK -USER SYSDBA -PAS masterkey
let nbfichier2=$nbfichier-1
nbfichier3= printf $nbfichier2 | wc -c

if
(( $nbfichier3 == 1 ))
then
for (( i = 1 ; i <= $nbfichier2 ; i++ ))
do

echo "Welcome $i times"
/opt/firebird/bin/gbak -B -V -L $directory/Vol0000$nbfichier3.FDB $directory/DUPLIQUEE/NOVAXEL.FBK -USER SYSDBA -PAS masterkey
done
fi


else
echo "le fichier NOVAXEL.FDB n'existe pas"
fi

s'est lorsque j'essai de faire se test:

if
(( $nbfichier3 == 1 ))
then
for (( i = 1 ; i <= $nbfichier2 ; i++ ))
do

echo "Welcome $i times"
/opt/firebird/bin/gbak -B -V -L $directory/Vol0000$nbfichier3.FDB $directory/DUPLIQUEE/NOVAXEL.FBK -USER SYSDBA -PAS masterkey
done
fi

qu'il intreprete mal le :

(( $nbfichier3 == 1 ))


Need help please...

Au cas ou sa se vois pas je débute sous linux et en programation shell script...
  • # question bete

    Posté par  . Évalué à 1.

    pour doubler toutes tes parantheses ?

    if ($toto == $titi)...
    serait aussi efficace.

    apparement il faut mettre des " pour qu'il evalue les variables
    http://abs.traduc.org/abs-4.2.01-fr/ch07s03.html

    if ( "$toto" == "$titi") ...
    • [^] # Re: question bete

      Posté par  . Évalué à 1.

      Ca ne marche pas... il essai d'executer se qu'il se trouve apres la premier variable...
      et forcement: ==1 comment note found
      • [^] # Re: question bete

        Posté par  . Évalué à 1.

        Ok j'ai trouver s'était bien un prob de syntaxe...

        Aux final j'utilise:
        if [ $nbfichier3 = "1" ]

        Et sa marche

        Merci encore...
  • # Divers

    Posté par  (site web personnel) . Évalué à 3.

    Cette contruction est inefficace (3 fork pour compter les fichiers, tu ne fait pas attention aux paths ... et je ne vois pas l'interêt du bc final)

    nbfichier=`ls $directory/*.FDB -1 | wc -l | bc `
    echo $nbfichier


    Meilleure solution

    set $directory/*.FDB
    echo "Total fichiers: $#"


    Et quel est l'objectif de ça:

    let nbfichier2=$nbfichier-1
    nbfichier3= printf $nbfichier2 | wc -c

    if (( $nbfichier3 == 1 ))


    Si c'est bien ce que je pense, cad vérifier qu'il y a moins de 10 fichiers dans le dossier la construction suivante est bien plus
    adaptée:

    shift

    if [ $# -lt 10 ] ou
    if test $# -lt 10


    La suite me pose encore plus de problemes.

    for (( i = 1 ; i <= $nbfichier2 ; i++ ))
    do
    echo "Welcome $i times"
    /opt/firebird/bin/gbak -B -V -L $directory/Vol0000$nbfichier3.FDB $directory/DUPLIQUEE/NOVAXEL.FBK -USER SYSDBA -PAS masterkey
    done


    Tu fait une boucle qui execute plusieurs fois exactement la même commande
    /opt/firebird/bin/gbak -B -V -L $directory/Vol0000$nbfichier3.FDB $directory/DUPLIQUEE/NOVAXEL.FBK -USER SYSDBA -PAS masterkey

    qui sera toujours interprété comme cela (vu que jsute avant tu as un test ($nbfichier3 == 1):
    /opt/firebird/bin/gbak -B -V -L $directory/Vol00001.FDB $directory/DUPLIQUEE/NOVAXEL.FBK -USER SYSDBA -PAS masterkey


    personnellement si mes assomptions sont bonnes voici comment j'aurais fait cela:


    #!/bin/bash
    GBAK=/opt/firebird/bin/gbak
    RM=/bin/rm
    MKDIR=/bin/mkdir
    #d
    basedir=/usr/local/Novaprout
    backupdir=$basedir/DUPLIQUEE

    # Suppression ancien backup
    $RM $backupdir
    # creation rep. backup
    $MKDIR $backupdir

    #Comptage du nombre de fichier FDB
    set $basedir/*.FDB
    echo "Total fichiers: $#"

    if [ $1 != "$basedir/NOVAXEL.FDB" ]; then
    echo "Le fichier NOVAXEL.FDB n'existe pas"
    echo "Le dossier $basedir n'est pas conforme aux specifications"
    exit
    fi

    while [ $# -gt 1 ]; then
    echo "Backing up $1 ...."
    $GBAK -B -V -L $basedir/$1 $backupdir/NOVAXEL.FBK -USER SYSDBA -PAS masterkey
    shift
    done



    Cela ne fonctionnera pas s'il y a d'autres fichiers que NOVAXEL.FBD et VOL*.FDB dans le dossier mais sinon ça doit être bon.
    S'il y a d'autre fichiers dans ce dossier, alors il faut modifier le set comme cela:

    set $basedir/NOVAXEL.* $basedir/VOL*
    • [^] # Re: Divers

      Posté par  . Évalué à 1.

      ton script ne fonctionne pas...

      Je vais tenter de m'expliquer un peut mieux...

      En faite pour faire une sauvegarde des bases firebird, il faut executer une commande Gbak avec un certain nombre de paramettre dont le nom du fichier d'entrée et celui de sortit...

      Techniquement il y a x fichier volxxxxx.FDB et obliguatoirement un NOVAXEL.FDB.

      Sachant qu'il faut executer une commande par fichier j'ai pencer au comptage + une boucle + Traitemant du novaxel.fdb a part...

      Et je block sur l'interpretation d'une ligne.
      • [^] # Re: Divers

        Posté par  . Évalué à 1.


        Sachant qu'il faut executer une commande par fichier


        techniquement simple
        pour traité tous les fichier *.FDB du dossier $basedir et les mettre dans le dossier DUPLIQUEE/

        evidemment je ne te file pas TOUT le script.


        cd $basedir
        for i in *.FDB;do
        $nomfile=`basename $i .FDB`
        /opt/firebird/bin/gbak -B -V -L $nomfile.FDB DUPLIQUEE/$nomfile.FBK -USER SYSDBA -PAS masterkey
        done


        il peut etre necessaire de tester $i pour savoir si c'est le fichier NOVAXEL et faire le traitement si ce dernier est different des autres traitements.
        • [^] # Re: Divers

          Posté par  . Évalué à 1.

          Ok je vais reguarder tes suggestions, mais pour avancer sur mon probleme, et si sa t'interesse la sintaxe de mon dernier if qui n'allais pas...

          la syntaxe correct était

          if [ $nbfichier3 = "1" ] tout attacher sans soter de ligne...


          Merci encore et je ne pert pas de vue tes suggestions.
      • [^] # Re: Divers

        Posté par  (site web personnel) . Évalué à 2.

        oui enfin a priori le tient ne fait pas cela non plus.

        qu'est-ce qui ne marche pas, exactement ?
        car c'est exactement ce que j'ai fait dans mon exemple.

        Quelques question quand même:
        1/ le fichier destination est -il toujours NOVAXEL.FDB ?
        2/ l'ordre de traitement est-il important ?

        Note qu'une erreur s'est effectivement glissée dans mon script:

        while [ $# -gt 1 ]; then
        echo "Backing up $1 ...."
        $GBAK -B -V -L $basedir/$1 $backupdir/NOVAXEL.FBK -USER SYSDBA -PAS masterkey
        shift
        done


        Cette erreur mise a part cette boucle prend tout les fichiers du dossier /usr/local/Novaxel et pour chacun execute la commande GBAK avec pour destination NOVAXEL.FBK (ca vient de ton script ça).

        Si la destination doit être le nom du fichier source en .FBK alors ça donne ceci:


        while [ $# -gt 1 ]; then
        echo "Backing up $1 ...."
        $base=`basename $1`
        $GBAK -B -V -L $1 $backupdir/${base/.FDB/.FBK} -USER SYSDBA -PAS masterkey
        shift
        done
        • [^] # Re: Divers

          Posté par  . Évalué à 1.

          s'est effectivement ça les fichiers sources et les fichiers de destination ont le meme non mais pas la meme extention...

          Je test...

          Dsl je suis en deplacement cette semaine encore donc risque de pas de reponce pendant un moment...

          Encore merci
  • # man find

    Posté par  (site web personnel) . Évalué à 2.

    tout est dans le titre.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.