Problême nombre entier dans script.sh

Résolu/Fermé
snow_frog Messages postés 216 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 26 juin 2020 - 11 mars 2009 à 12:58
snow_frog Messages postés 216 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 26 juin 2020 - 11 mars 2009 à 20:46
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

snow_frog Messages postés 216 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 26 juin 2020 139
11 mars 2009 à 14:05
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
snow_frog Messages postés 216 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 26 juin 2020 139
11 mars 2009 à 18:15
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
11 mars 2009 à 18:46
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
snow_frog Messages postés 216 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 26 juin 2020 139
11 mars 2009 à 19:02
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
11 mars 2009 à 19:23
[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
snow_frog Messages postés 216 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 26 juin 2020 139
11 mars 2009 à 19:41
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
11 mars 2009 à 19:55
[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
snow_frog Messages postés 216 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 26 juin 2020 139
11 mars 2009 à 20:15
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
snow_frog Messages postés 216 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 26 juin 2020 139
11 mars 2009 à 20:46
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