Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/09/2013, à 19:46

Raja26

besoin d'aide sur un script bash

Bonjour à tout le monde,

Je suis débutant en programmation des scripts bash. Et merci de m'avoir accepté parmi vous.

Je dois créer un script bash permettant d'afficher le plus petit des entiers lus sur l'entrée standard. Je vous joint ce que j'ai fait; mais il me semble que cela ne fonctionne pas.

#! /bin/bash
Entiers="valeur1 valeur2 valeur3 valeur4 valeur5"

for line in $Entiers; do
read line
min=$( $line | sort -r )
echo  $min
done
fi

Pour cela, j'ai trié la ligne de mes paramètres dans l'ordre décroissant et je me suis dit qu'il fallait récupérer le premier entier de ce tri, mais je n'arrive pas à le faire.

Merci de me faire un retour sur le script.

Dernière modification par Raja26 (Le 19/09/2013, à 19:56)

Hors ligne

#2 Le 19/09/2013, à 20:09

pingouinux

Re : besoin d'aide sur un script bash

Bonsoir,
Je ferais ceci :

#! /bin/bash

sed 's/  */\n/g' - | sort -n | head -1

Les valeurs sont lues sur l'entrée standard (séparées par des espaces, ou sur plusieurs lignes). Pour indiquer la fin de la lecture, si c'est au clavier, entrer Ctrl+D.

Les espaces consécutifs sont remplacés par \n, on trie le résultat en valeurs numériques croissantes, et on prend la première ligne.

Hors ligne

#3 Le 19/09/2013, à 20:11

MicP

Re : besoin d'aide sur un script bash

man sort
man sort a écrit :

Trier les lignes de fichiers texte

...
-n, --numeric-sort
              comparer selon la valeur numérique de la chaîne
...

=============

man read

=============

$line | sort -r

Ici, aucune commande n'envoie la variable "$line" vers le pipe "|"

=============
Ton code (indenté)entouré de balise (dans l'éditeur : [­­code]ton code ici[­/code])
L'indentation permet de mieux se rendre compte des oublis de ce genre

#! /bin/bash
# il manque un "if" étant donné que ça finit par un "fi"
  Entiers="valeur1 valeur2 valeur3 valeur4 valeur5"
  for line in $Entiers; do
      read line
      min=$( $line | sort -r )
      echo  $min
  done
fi

Pour les balises codes, tu sélectionne tout le code et tu clique sur l'icône <> située en haut de la fenêtre d'édition.
ensuite tu regarde ce que ça donne avec le bouton "Prévisualisation" (en bas de la fenêtre d'édition.

===============
Ton code ne peut pas fonctionner avec ces commandes:
Ici, un peu (beaucoup) de lecture

Dernière modification par MicP (Le 19/09/2013, à 20:14)

Hors ligne

#4 Le 19/09/2013, à 21:48

Raja26

Re : besoin d'aide sur un script bash

Merci pour ta réponse. Il y a des trucs que je n'arrive pas à comprendre dans la commande sed,  l'espace entre s/ et l'étoile et /g .

pingouinux a écrit :

Bonsoir,
Je ferais ceci :

#! /bin/bash

sed 's/  */\n/g' - | sort -n | head -1

Les valeurs sont lues sur l'entrée standard (séparées par des espaces, ou sur plusieurs lignes). Pour indiquer la fin de la lecture, si c'est au clavier, entrer Ctrl+D.

Les espaces consécutifs sont remplacés par \n, on trie le résultat en valeurs numériques croissantes, et on prend la première ligne.

Hors ligne

#5 Le 19/09/2013, à 22:40

Hizoka

Re : besoin d'aide sur un script bash

s/element a remplacer/element qui remplace/
g : toutes les occurences d'une meme ligne (sans le g, seul la 1ere occurence est changée)
s/  */\n/g
Remplace tous les espaces ou espaces multiples par un saut de ligne.

# La commande donné :
echo "a b c d" | sed 's/  */\n/g'
a
b
c
d

# La meme commande sans le "g"
echo "a b c d" | sed 's/  */\n/'
a
b c d

# la meme commande avec " *" au lieu de "  *"
echo "a b c d" | sed 's/ */\n/g'

a
b
c
d

Voila quelques exemples.

Dernière modification par Hizoka (Le 19/09/2013, à 22:41)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#6 Le 20/09/2013, à 02:34

Watael

Re : besoin d'aide sur un script bash

salut,

$ var="2   5 1   3"
$ tableau=( $(echo "${var//+( )/$'\n'}" | sort -n) )
$ echo ${tableau[0]}
1
MicP a écrit :

aucune commande n'envoie la variable "$line" vers le pipe "|"

et puis, $line ne contient qu'une seule valeur qu'il n'est pas possible de trier !


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 20/09/2013, à 04:24

nesthib

Re : besoin d'aide sur un script bash

Une version avec python :

python3 -c 'print(min(map(int, input().split(" "))))'

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#8 Le 21/09/2013, à 20:19

Raja26

Re : besoin d'aide sur un script bash

 #! /bin/bash

echo " entrez les valeurs souhaitées"
read var
nombre=' echo $var | sort -n | head -1'
echo $nombre

et après est-ce que j'ai le droit d'affecter une expression à une variable comme j'ai fait en haut avec des anti-quotes. Je rappelle que le programme a pour but d'afficher le min des entiers saisis par l'utilisateur.

Dernière modification par Raja26 (Le 21/09/2013, à 20:20)

Hors ligne

#9 Le 21/09/2013, à 20:21

Hizoka

Re : besoin d'aide sur un script bash

nombre=' echo $var | sort -n | head -1'

ne marche ra pas... il ne faut pas utiliser de '' mais $(...) ou la version dépréciée ``


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#10 Le 21/09/2013, à 20:34

Raja26

Re : besoin d'aide sur un script bash

Comme ceci j'espère :

nombre=$(echo $var | sort -n | head -1)

Mais malheureusement, cela ne marche pas . Je ne sais pas pourquoi !

Hors ligne

#11 Le 21/09/2013, à 20:37

pingouinux

Re : besoin d'aide sur un script bash

Si var contient les entiers séparés par des espaces, il n'y a qu'une seule ligne : sort et head ne font rien.

Hors ligne

#12 Le 21/09/2013, à 20:40

Raja26

Re : besoin d'aide sur un script bash

pingouinux a écrit :

Si var contient les entiers séparés par des espaces, il n'y a qu'une seule ligne : sort et head ne font rien.

Effectivement, var contient la ligne des entiers séparés par des espaces. Mais, je ne vois pas comment il faut faire pour lire-trier la ligne dans l'ordre décroissant et récupérer que la première valeur pour l'afficher par la suite.

Hors ligne

#13 Le 21/09/2013, à 20:48

pingouinux

Re : besoin d'aide sur un script bash

Tu as trois méthodes à ta disposition :
Celle que je t'ai indiquée en #2
Celle de Watael en #6
Celle de nesthib en #7

Hors ligne

#14 Le 21/09/2013, à 21:03

Raja26

Re : besoin d'aide sur un script bash

pingouinux a écrit :

Tu as trois méthodes à ta disposition :
Celle que je t'ai indiquée en #2
Celle de Watael en #6
Celle de nesthib en #7

la tienne, je l'ai exécutée mais elle ne me renvoie rien comme valeur. Peut-être que je ne l'ai pas fait comme il fallait. Normalement, quand je termine de saisir les valeur j'appuie sur ctrl+d et ça me renvoie la valeur min, ou je me trompe ?

Hors ligne

#15 Le 21/09/2013, à 21:10

pingouinux

Re : besoin d'aide sur un script bash

Oui, c'est bien ça. Peux-tu faire un copier-coller de la façon dont tu procèdes ?

Ajouté : Tu peux aussi faire ceci

#! /bin/bash

read -p "Entrez les valeurs souhaitées : " var
nombre=$(echo $var | sed 's/  */\n/g' | sort -n | head -1)
echo $nombre

Dernière modification par pingouinux (Le 21/09/2013, à 21:17)

Hors ligne

#16 Le 21/09/2013, à 21:16

Raja26

Re : besoin d'aide sur un script bash

pingouinux a écrit :

Oui, c'est bien ça. Peux-tu faire un copier-coller de la façon dont tu procèdes ?

j'appelle la fonction ./min1.sh j'appuie sur Entrée , cela fait un saut de ligne . Après, je saisis mes valeurs suivies du Ctrl+D. C'est cela non ?

Hors ligne

#17 Le 21/09/2013, à 21:19

pingouinux

Re : besoin d'aide sur un script bash

Le Ctrl+D doit être précédé de l'appui sur la touche Entrée.

Hors ligne

#18 Le 21/09/2013, à 22:08

Raja26

Re : besoin d'aide sur un script bash

pingouinux a écrit :

Le Ctrl+D doit être précédé de l'appui sur la touche Entrée.

Cette fois-ci j'ai fait le même exercice mais avec des entiers passés en argument . Et j'ai pris par défaut la première valeur comme min avec laquelle je dois comparer le reste des valeurs. Mais, le souci qui se pose c'est qu'il me renvoie le nombre de i et pas de l'entier !

#! /bin/bash

i=2
min=$1
for i in $#; do
if [ "$i" -lt "$min" ];then
min=$i
fi
echo "la valeur min est :" $i
done

Hors ligne

#19 Le 22/09/2013, à 02:02

nesthib

Re : besoin d'aide sur un script bash

« $# » est le nombre d'arguments. Ta boucle « parcourt » donc cet unique élément. Je suppose que tu cherches « $@ ».

min=$1
for i in $@
do
  min=$(( i < min ? i : min ))
done
echo "la valeur min est : $min"

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#20 Le 22/09/2013, à 17:00

Raja26

Re : besoin d'aide sur un script bash

Merci à vous tous, cela m'a été bénéfique.  Pour appeler une fonction , j'ai fait comme ceci :

le problème qui se pose, c'est que lorsque je fais appel à la fonction min2 qui renvoie le minimum des entiers passés en paramètre, elle ne me renvoie rien! Est-ce normal ?

#! /bin/bash

function min1
{
echo "Entrez les valeurs souhaitées : "
read var
nombre=$(echo $var | sed 's/  */\n/g' | sort -n | head -1)
echo $nombre
}


function min2
{
i=2
min=$1
for i in $@ ; do
if [ "$i" -lt "$min" ];then
min=$i
fi
done
echo "la valeur min est : $min"
}


if [ "$#" == 0 ]; then
min1
else 
min2
fi

Hors ligne

#21 Le 22/09/2013, à 17:47

pingouinux

Re : besoin d'aide sur un script bash

C'est parce que tu ne transmets pas les arguments du script à min2. Il faut l'appeler ainsi :

min2 "$@"

Hors ligne

#22 Le 22/09/2013, à 22:28

nesthib

Re : besoin d'aide sur un script bash

Je me doute que c'est pour apprendre, mais tu fais un peu compliqué pour pas grand chose là (cf. message #19) wink


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#23 Le 22/09/2013, à 23:28

Raja26

Re : besoin d'aide sur un script bash

nesthib a écrit :

Je me doute que c'est pour apprendre, mais tu fais un peu compliqué pour pas grand chose là (cf. message #19) wink

Je t'assure que c'est pour apprendre, mais je préfère appliquer vos solutions autrement. Si vous me donnez des solutions prêtes , je ne pense pas que j'apprenne quelque chose

Hors ligne

#24 Le 22/09/2013, à 23:35

Raja26

Re : besoin d'aide sur un script bash

Je dois faire un script shell qui affiche tous les fichiers du répertoire passé en argument ( ou du répertoire courant si aucun répertoire n'est passé en paramètre ) en encadrant de crochets le nom des fichiers correspondant à des répertoires et en faisant suivre d'une étoile le nom des fichiers exécutables . Auriez-vous des propositions ?

par avance , je vous remercie.

Hors ligne

#25 Le 23/09/2013, à 02:14

nesthib

Re : besoin d'aide sur un script bash

Tu vas devoir faire une boucle :

for fichier in *
do
    commande "${fichier}"
done

Pour chaque fichier tu devras tester s'il s'agit d'un répertoire ou d'un fichier exécutable, lis le man de bash à la section « CONDITIONAL EXPRESSIONS » (tape « /CONDITIONAL EXPRESSIONS[entrée] » pour y accéder directement). Tu apprendras comment faire ce genre de tests smile
Indice pour les dossiers : [ -d … ]

NB. juste une petite remarque HS ; en français il n'y a pas d'espace avant le point ou la virgule, ni après une parenthèse ouvrante ou avant une parenthèse fermante.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne