Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

#1 Le 23/11/2009, à 18:10

scoulep

[Aide] Compréhension de commandes

Bonjour

En cours, nous travaillons actuellement sur les commandes de consoles Shell sous Ubuntu (9.10 je pense).

Nous devons réaliser un menu proposant de lister, supprimer, vider ou avoir des infos sur un fichier.
Voici la correction qu'on nous a fourni :

#!/bin/bash
clear
nb_commandes=`wc -l $1 |cut -d" " -f1`
while read choix
do
      ch=`echo $choix|cut -d: -f1`
      menu="$menu $ch"

done <$1
echo -e "\nQuelle action souhaitez-vous réaliser sur le fichier : $2?"
PS3="Entrez-votre choix : "
select reponse in `echo $menu`
do
      case $REPLY in
            [0-9]*)if test $REPLY -gt $nb_commandes
                  then
                        echo -e "\nChoix ($REPLY) non valide, recommencez"
                        continue
                  fi;;
            *) echo -e "\nChoix $REPLY non valide, recommencez";continue;;
      esac
      clear
      echo -e "\n Vous avez choisi ($REPLY) : $reponse $2"
      while read commande
      do
            if test $reponse = `echo $commande|cut -d: -f1`
            then
                  cde=`echo $commande|cut -d: -f2-`
                  echo -en "\n\t==> La commande exécutée est : << $cde $2
>>\n\n\t"
                  $cde $2
                  echo
                  exit $?

            fi
      done <$1
done

Les bouts de code que je ne comprends pas sont en gras.
Pensant que l'on devait débuter directement par la question, je ne comprends pas le premier bout de code que l'on nous a donné avant la question.
Ensuite, je ne comprends pas la majorité des "pipe cut" qui viennent agrémenter la plupart des commandes.

je vous remercie par avance de votre aide.
Bonne soirée.
A bientôt.

Dernière modification par scoulep (Le 23/11/2009, à 18:11)

Hors ligne

#2 Le 23/11/2009, à 18:39

sensini

Re : [Aide] Compréhension de commandes

cut peut prendre plusieurs options dont
-d : choix du délimiteurs (-d: prend «:» comme délimiteur, -d" " prend l'espace comme délimiteur etc)
-f : les colonnes à afficher
| cut -d" " -f1 va donc prendre le premier champ (chaque champ étant séparé par une espace(

wc -l $1 affiche le nombre de ligne de $1, $1 étant le premier argument que tu as passé en ligne de commande
(./monscript.sh choses machin : $1=choses)

les backquotes servent à exécuter une commande (pour par exemple stocker la sortie dans une variable)

nb_commandes=`wc -l $1 |cut -d" " -f1` : la variable nb_commandes contient donc le nombre de ligne du fichier (on est d'accord que là le cut ne sert à rien puisqu'il y a l'option -l à wc)


menu="$menu $ch" tu stockes menu, une espace, ch, dans la variable menu
par exemple si ch=ls et que menu=cat wc, menu devient «cat wc ls», tout simplement

PS3="Entrez-votre choix : " : il existe plusieurs variables de prompt en bash : PS1 est le prompt de la ligne de commande (par exemple toto@machine), PS3 sert  de prompt pour la variable select. (essaye de changer sa valeur et regarde ce que ça change au script

[0-9]*)if test $REPLY -gt $nb_commandes : dans le cas où la réponse est composée de chiffre ([0-9]*) on exécute if test $REPLY -gt $nb_commandes
-gt pour greater than (plus grand que)
donc si la réponse est un chiffre, mais plus grand que le nb de choix, erreur

echo -en -n = ne pas sauter de ligne en fin d'echo, -e = interpréter les \n, \t, etc

$cde $2 : exécute la commande stockée dans la variable cde sur le fichier passé en 2m argument (./monscript.sh choses machin : $2=machin)

echo affiche « » rien, c'est-à-dire saute une ligne

exit $? termine le script avec le code de sortie de la dernière commande
exemple:
[540] <u@h>echo

[541] <u@h>echo $?
0
[542] <u@h>eho $?
bash: eho : commande introuvable
[543] <u@h>echo $?
127

Voilà qui devrait t'aider à y voir un petit peu plus clair


http://doc.ubuntu-fr.org/aptitude
http://bepo.fr
Pensez à chercher sur un moteur de recherche avant de demander http://lmgtfy.com/ ;)

Hors ligne

#3 Le 23/11/2009, à 19:51

scoulep

Re : [Aide] Compréhension de commandes

Bonsoir et merci pour cette réponse très rapide. Grâce à vous, j'ai enfin pu comprendre ce script de façon plus claire, et je vous en remercie.

Désolé de vous déranger une nouvelle fois, mais j'ai un nouveau cas de commandes utilisant cette fois ci le "shift", qui ne m'est toujours pas très clair quant à son utilisation (j'ai compris le principe de changement de variable, mais dans la pratique...) :

#!/bin/bash
clear
expression=$*
echo -ne "\n Evaluation de l'expression : $*\n"
declare -i resultat
resultat=$1
shift

while [ $# -gt 0 ]
do
echo -n "calcul de $resultat $1 $2 = "

case $1 in
+)./additionneur.sh $resultat $2 ;;
-)./soustracteur.sh $resultat $2 ;;
x)./multiplieur.sh $resultat $2 ;;
/)./diviseur.sh $resultat $2 ;;
*)echo "Erreur de syntaxe ";exit 1 ;;
esac
resultat=$?
echo $resultat
shift 2
done
echo -e "\n\t$expression = $resultat\n"

Je n'ai pas mis les fonctions qui effectuent les opérations car je les ai compris.
Une nouvelle fois, j'ai mis en gras ce que je ne comprends pas : je connais leur fonction, mais j'ai encore un peu de mal à distinguer leur utilisation ici.

Je vous remercie par avance de votre aide.
Bonne soirée.
A bientôt.

Dernière modification par scoulep (Le 23/11/2009, à 19:52)

Hors ligne

#4 Le 24/11/2009, à 13:04

sensini

Re : [Aide] Compréhension de commandes

Content d'avoir pu aider!
Si l'anglais ne te fait pas peur, voici un site indispensable pour le bash: http://tldp.org/LDP/abs/html/ (il se peut qu'il existe une traduction française le cas échéant)

$* : tout simplement la liste des arguments (à qq nuances près)
$# : tout simplement le nombre d'arguments

Par défaut les arguments sont des chaines de caractères
declare -i resultat permet de déclarer la variable résultat comme un entier
resultat=$1 le premier argument est donc mis dans la variable résultat et est considéré comme un entier
shift : supposons que l'appel au script soit ./monscript.sh tata titi toto, avant le shift on a $1=tata $2=titi $3=toto et $#= 3
après le shift on a $1=titi $2=toto $#=2

while [ $# -gt 0 ] tant que le nombre d'argument (restant) est plus grand que 0 (gt=greater than)

resultat=$?
resultat reçoit la valeur de sortie de la précédente commande
shift 2 décale les arguments de 2 ($1= l'ancien $3, etc)

À+


http://doc.ubuntu-fr.org/aptitude
http://bepo.fr
Pensez à chercher sur un moteur de recherche avant de demander http://lmgtfy.com/ ;)

Hors ligne

#5 Le 24/11/2009, à 21:12

scoulep

Re : [Aide] Compréhension de commandes

Merci beaucoup pour ton aide qui m'a été très utile !

Bonne soirée.

Hors ligne

Haut de page ↑