Problême nombre entier dans script.sh [Résolu/Fermé]

Signaler
Messages postés
216
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
26 juin 2020
-
Messages postés
216
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
26 juin 2020
-
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

Messages postés
216
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
26 juin 2020
132
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
Messages postés
216
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
26 juin 2020
132
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 ?
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 774
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]$
;-))
Messages postés
216
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
26 juin 2020
132
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 ?
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 774
[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]$
Messages postés
216
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
26 juin 2020
132
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...
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 774
[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]$
;-))
Messages postés
216
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
26 juin 2020
132
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
Messages postés
216
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
26 juin 2020
132
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!!