Problême nombre entier dans script.sh

Résolu
snow_frog Messages postés 214 Date d'inscription   Statut Membre Dernière intervention   -  
snow_frog Messages postés 214 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

voilà un petit morceau de script qui me pose problème:


> cat test

#!/bin/bash

DATA="releve_niveau*.txt"

for DIR in `find -type d`; do
for FILE in $DIR/$DATA ; do
for i in $FILE ; do

NIV=$(cut -d "," -f2 $i)
for j in $NIV ; do
if [ $j -eq 0 ]            # c'est ici que se trouve l'erreur
  then
    ABS=$i
  else
    ABS=$(echo "(0 - $j) " | bc) 
fi

echo "pour $j le nombre absolu est $ABS"
sleep 1

done
done
done


voilà, le message d'erreur que je recoit lors de l'exucution du script:

./test: line 11: [: -5.259: integer expression expected


commet comparer ma variable j (qui n'est pas un nombre entier) par rapport à 0 ?
faut-il quelque chose du genre if [ $j "inferieur ou égal" 0 | bc ]

2ème questions: peut on faire quelque chose du genre: if [ -0.5<$j<0.5] ; then ....

8 réponses

  1. snow_frog Messages postés 214 Date d'inscription   Statut Membre Dernière intervention   139
     
    je viens de trouver une première étape: rempalcer -eq (pour nombre entier) par >
    par contre, j'ai l'impression qu'il ne prend pas en compte mon "else" dans ma boucle if.

    if [ "$j" < 0 ]
      then
        ABS=$(echo "(0 - $j) " | bc)
    
    fi


    par contre, il m'inverse même les valeurs positives qui se retrouvent donc négative....

    je veux juste que les valeurs négatives passent positive
    0
  2. snow_frog Messages postés 214 Date d'inscription   Statut Membre Dernière intervention   139
     
    oups, petit probleme dans mon précedent post/script,

    alors voilà, je recommence à zero....

    snow_frog@mars:~/Bureau/script$ ll
    releve_niveau_jeudi.txt
    releve_niveau_vendredi.txt
    
    snow_frog@mars:~/Bureau/script$ cat releve_niveau_vendredi.txt
    06, -4.58
    07, -4.37
    08, 2.54
    09, 3.78
    
    snow_frog@mars:~/Bureau/script$ cat test
    
    #!/bin/bash
    
    DATA="releve_niveau*.txt"
    
    for DIR in `find -type d`; do # pour chaque répertoire présent dans rep courant
    for FILE in $DIR/$DATA ; do # pour chaque fichier $DATA présent dans ces répertoires
    for i in $FILE ; do # pour chaque ligne présent dans lignes présentent dans ces ficheri $FILE
    
    NIV=$(cut -d "," -f2 $i) # on garde la deuxième colonne uniquement. délimiteur de champs "virgule"
    for j in $NIV ; do # pour chaque ligne $j présent dans cette deuxième colonne isolé
    if [ "$j" < 0 ] # on cherche à savoir si cette valeur est plus petite que 0 (donc négative)
      then
        ABS=$(echo "(0 - $j) " | bc) # si valeur < 0 alors on l'a rend positive
     else
       ABS=$j # sinon on la laisse positive
    fi
    
    echo "pour $j l'absolu est $ABS
    
    done
    done
    done
    done


    mais voilà, quand je lance le script, il m'inverse bien le signe des valeurs négatives (boucle if then)
    mais pour les valeurs positives, il m'inverse aussi le signe(normalement boucle if else)
    pourquoi ne prend-il pas en compte mon else ?
    0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Je ne pense pas que le shell bash accepte les signes < et > comme comparateur ;-\

    De toutes façons si ce n'est que pour enlever le signe négatif, pas la peine de te prendre la tête :
    [plop]$ cat fich
    06, -4.58
    07, -4.37
    08, 2.54
    09, 3.78
    
    [plop]$ cat foo.sh
    #! /bin/sh
    
    #set -xv
    
    NIV=$(cut -d " " -f2 < $1)
    for j in $NIV ; do
    echo "pour $j l'absolu est ${j/-/}"
    done
    
    [plop]$ ./foo.sh fich
    pour -4.58 l'absolu est 4.58
    pour -4.37 l'absolu est 4.37
    pour 2.54 l'absolu est 2.54
    pour 3.78 l'absolu est 3.78
    
    [plop]$
    ;-))
    0
  4. snow_frog Messages postés 214 Date d'inscription   Statut Membre Dernière intervention   139
     
    merci,

    En fait, le but final étant de trouver la valeur la plus proche de 0 est d'afficher la ligne (les 2 colonnes) ou cette valeur est obtenue.

    ce que je pensais faire, c'était d'abord convertir ma deuxieme colonne pour n'obtenir que des chiffre supérieur à 0 (ou inférieur peu importe) et ensuite de trier par ordre croissant et d'extraire la première ligne "sort -n | head -1" pour obtenir la valeur la plus proche de 0

    Si je comprend bien, ta solution me permet "juste" d'afficher sans le signe moins ?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    [plop]$ cat fich
    06, -4.58
    07, -4.37
    08, 2.54
    09, 3.78
    
    [plop]$ cut -d " " -f2 < fich | tr -d '-' |sort -n | head -1
    2.54
    
    [plop]$
    0
  7. snow_frog Messages postés 214 Date d'inscription   Statut Membre Dernière intervention   139
     
    merci bien, ça fonctionne comme il faut,
    par contre, ce que je veux, c'est retourner la valeur de la première et deuxième colonne (dans mon cas "08, 2.54" .
    je pense donc utiliser un {print $1, $2} par contre, après plusieur essai, je ne vois pas ou l'inserer...

    je me rappelle d'un sujet sur CCM qui permettait de "garder en mémoire" la ligne ou on satisfaisait à la commande mais je n'arrive plus à le retrouver...
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      [plop]$ cat fich
      06, -4.58
      07, -4.37
      08, 2.54
      09, 3.78
      
      [plop]$ sort -t '-' +1n fich | head -1
      08, 2.54
      
      [plop]$
      ;-))
      0
  8. snow_frog Messages postés 214 Date d'inscription   Statut Membre Dernière intervention   139
     
    merci,

    pour mon info, le +ln est associé à la commande sort ?
    chez moi, j'obtiens une erreur avec ta ligne de commande juste au dessus
    0
  9. snow_frog Messages postés 214 Date d'inscription   Statut Membre Dernière intervention   139
     
    voilà comment je me suis débrouillé:

    NIV=$(cut -d " " -f2 < $i | tr -d '-' | sort -n | head -1 )
    CHECK=$(grep $NIV $i )
    et là, ça m'affiche ma ligne entière!!
    0