#1 Le 23/11/2009, à 17: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, à 17:11)
Hors ligne
#2 Le 23/11/2009, à 17: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://google.fr/ ;)
Hors ligne
#3 Le 23/11/2009, à 18: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, à 18:52)
Hors ligne
#4 Le 24/11/2009, à 12: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://google.fr/ ;)
Hors ligne
#5 Le 24/11/2009, à 20: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