shell equipe id bioinformatics training course june 2014
TRANSCRIPT
ShellShell
Equipe IDBioinformatics Training CourseJune 2014
Le shell est le langage de commande standard du système UNIXBourne shellKorn shellC-shellBash-shell.
ShellShell
$ more example.sh$ more example.sh
#!/bin/bash#!/bin/bashwhile truewhile truedodo cat somefile > /dev/null somefile > /dev/null echo . .donedone
File example.sh must have executable rightsFile example.sh must have executable rights
bash example.shbash example.sh./example.sh./example.sh
Shell ScriptsShell Scripts
ShellShell
Interprété Vrai langage de programmtion : test,
itérations, récursion, variables, environnement, alias, variables typées, opérateurs logiques, arithmétiques et binaires, variables locales, gestion des tâches, historique et édition des commandes
Shell : variablesShell : variables IdentificateurIdentificateur
Une suite quelconque de :Une suite quelconque de :- lettres minuscules ou majuscules- lettres minuscules ou majuscules- chiffres- chiffres- _ (underscore)- _ (underscore)- ne commençant pas par un chiffre- ne commençant pas par un chiffre
Valeur : toujours une chaine de caractèresValeur : toujours une chaine de caractères Opérateur d’affectation : « = »Opérateur d’affectation : « = » Evaluation d’une variable :Evaluation d’une variable :
$variable$variable Affichage de la valeur d’une variable :Affichage de la valeur d’une variable :
echo $variableecho $variable
Shell : compléments Shell : compléments syntaxiquessyntaxiques
CommentaireCommentaire
# la fin de la ligne est # la fin de la ligne est ignoréeignorée
Les commandes doivent être Les commandes doivent être séparées par des retours chariot ou séparées par des retours chariot ou des points virgulesdes points virgules
Séparateur implicite du shell = Séparateur implicite du shell = caractère espacecaractère espace
Shell : redirection des entrées-Shell : redirection des entrées-sortiessorties
EntréeEntréecommande > fichier commande > fichier commande 1> fichier commande 1> fichier
Associe le fichier au descripteur 1 (implicitement)Associe le fichier au descripteur 1 (implicitement)
commande 2> fichier # erreur redirigée vers fichiercommande 2> fichier # erreur redirigée vers fichier
commande >&2 commande >&2 # stdout associé à stderr # stdout associé à stderr
commande 2>&1 commande 2>&1 # stderr associé à stdout # stderr associé à stdout
Ex :Ex :commande 2>/dev/null 1>&2commande 2>/dev/null 1>&2
commande 1>/dev/null 2>&1commande 1>/dev/null 2>&1
ShellShell : saisie: saisie
Commande << EOFCommande << EOF# la commande lit l’entrée standard jusqu’à la # la commande lit l’entrée standard jusqu’à la
reconnaissance d’une ligne constituée de la chaîne reconnaissance d’une ligne constituée de la chaîne EOFEOF
Ex:Ex:Cat > compile << FINCat > compile << FINif [ $# -ne 2 ] ; then exit 1if [ $# -ne 2 ] ; then exit 1fifiif [ -r $1 ]if [ -r $1 ]
then cc $1 –o $2 -0 ; size $2then cc $1 –o $2 -0 ; size $2else exit 2else exit 2
fifiFIN FIN
Shell : lecture de la valeur d’une Shell : lecture de la valeur d’une varaible dans un script shellvaraible dans un script shell
Lecture de la valeur d’une variable :Lecture de la valeur d’une variable :
read Variable1 …. Variablenread Variable1 …. Variablen
Val1 … ValnVal1 … Valn
Vali est liée à VariableiVali est liée à Variablei
Protection des variables Protection des variables préalablementpréalablement
readonly Variable1 …. Variablenreadonly Variable1 …. Variablen
Shell : délimiteurs de chaines de Shell : délimiteurs de chaines de caractèrescaractères
''chainechaine' : la chaîne est prise littéralement ' : la chaîne est prise littéralement sans substitutionsans substitution
"chaine" : la chaîne est prise littéralement "chaine" : la chaîne est prise littéralement après substitution des caractères $ après substitution des caractères $ (évaluation des variables) et \.(évaluation des variables) et \.
‘‘commande`: la chaine complète est commande`: la chaine complète est remplacée par la valeur de la commande remplacée par la valeur de la commande (la sortie standard de celle-ci).(la sortie standard de celle-ci).
Shell : délimiteurs de chaines de Shell : délimiteurs de chaines de caractères (exemple)caractères (exemple)
x=totox=totoecho $xecho $xtotototoecho echo ' ' $x$x ' '$x$xecho " echo " $x$x " " totototoX=pwdX=pwdecho $xecho $xpwdpwdecho " echo " $x = ‘$x`$x = ‘$x` « « pwd=/usr/vous pwd=/usr/vous
Shell : évaluation des variablesShell : évaluation des variables
$var : valeur de var; rien si var indéfinie$var : valeur de var; rien si var indéfinie ${var} : idem${var} : idem ${var:-val} : valeur de var si définie, val dans ${var:-val} : valeur de var si définie, val dans
le cas contraire; var inchangéele cas contraire; var inchangée ${var:=val} : valeur de var si définie, val dans ${var:=val} : valeur de var si définie, val dans
le cas contraire; var devient val si indéfiniele cas contraire; var devient val si indéfinie ${var:?message} : valeur de var si définie, ${var:?message} : valeur de var si définie,
sinon la valeur de message est affichée et le sinon la valeur de message est affichée et le shell se termineshell se termine
${var:+val} : valeur de var si définie, rien ${var:+val} : valeur de var si définie, rien sinon.sinon.
Shell : visibilité des variablesShell : visibilité des variables
Les variables sont locales à un Les variables sont locales à un shellshell
Les variables du père ne sont pas Les variables du père ne sont pas implicitement transmises à ses fils implicitement transmises à ses fils (export)(export)
Le fils ne peut pas modifier les Le fils ne peut pas modifier les variables du père.variables du père.
Shell : l’environnement de Shell : l’environnement de l’utilisateurl’utilisateur
Certaines variables sont initialisées Certaines variables sont initialisées au début de la session par le shell au début de la session par le shell lui-même qui exécute deux lui-même qui exécute deux commandes :commandes :
/etc/profile/etc/profile
$HOME/.profile (ou $HOME/.bashrc)$HOME/.profile (ou $HOME/.bashrc)
ENVENV
Shell : principales variables Shell : principales variables d’environnementd’environnement
HOME : répertoire initialHOME : répertoire initial PATH : chemin de recherche des exe (login)PATH : chemin de recherche des exe (login) TERM : le type de terminalTERM : le type de terminal MAIL : la boite aux lettres MAIL : la boite aux lettres SHELL : le type de shellSHELL : le type de shell LOGNAME : nom de connexion LOGNAME : nom de connexion HISTSIZE : le nombre de lignes d’historiqueHISTSIZE : le nombre de lignes d’historique PWD : le répertoire courantPWD : le répertoire courant
Shell : paramètres de procédureShell : paramètres de procédure
La valeur des paramètres est transmise à la La valeur des paramètres est transmise à la procédure de la façon suivante :procédure de la façon suivante :
$0 : le nom de la procédure$0 : le nom de la procédure$i : le ième paramètre$i : le ième paramètre$* : la liste de tous les paramètres$* : la liste de tous les paramètres$# : le nombre paramètres fournis à la $# : le nombre paramètres fournis à la
procédureprocédure Opérateurs liés aux paramètres :Opérateurs liés aux paramètres :shift[n] : décale de n positions vers la gauche la shift[n] : décale de n positions vers la gauche la
liste des paramètres et décrémente $# de nliste des paramètres et décrémente $# de nset paramètres : range de nouveaux paramètres set paramètres : range de nouveaux paramètres
dans l’environnementdans l’environnement
Shell : paramètres de procédure Shell : paramètres de procédure (exemple)(exemple)
set ‘who am i`set ‘who am i`
echo echo ""Utilisateur : $1 Utilisateur : $1 ""
echo echo "" Terminal : $2 Terminal : $2 ""
echo echo "" Connexion : $4 $3 $5 Connexion : $4 $3 $5 ""
Shell : caseShell : case
Le choix multiple : caseLe choix multiple : casecase <chaine> incase <chaine> in<constante>) <liste de commandes>;;<constante>) <liste de commandes>;;
<constante>) <liste de commandes>;;<constante>) <liste de commandes>;; … … esacesac
La constante peut-être de la forme :La constante peut-être de la forme :constante1| constante2 | … |constanteNconstante1| constante2 | … |constanteN
Shell : case (exemple)Shell : case (exemple)
# la commande « qui » avec la date en français# la commande « qui » avec la date en françaisset ‘who am i`set ‘who am i`echo echo ""Utilisateur : $1 Utilisateur : $1 ""echo echo ""Terminal : $2 Terminal : $2 ""case $3 incase $3 in
Jan) m=Janvier;;Jan) m=Janvier;;Feb) m=Fevier;;Feb) m=Fevier;;……Dec) m=Decembre;;Dec) m=Decembre;;
esacesacecho " echo " Connexion : $4 $m $5 Connexion : $4 $m $5 ""
Shell : forShell : for
for <var> in <chaine1> … <chaineN>for <var> in <chaine1> … <chaineN> do <liste de commandes>do <liste de commandes> donedone
for <var>for <var> do <liste de commandes>do <liste de commandes> donedone
for <var> in $*for <var> in $* do <liste de commandes>do <liste de commandes> donedone
Exemple : Exemple : #affichage des arguments de la ligne de commande#affichage des arguments de la ligne de commandefor arg in $*for arg in $*
do echo $argdo echo $argdonedone
Shell : exprShell : expr
La commande expr :La commande expr :effectue des opérations sur les expressions passées en effectue des opérations sur les expressions passées en
paramètreparamètrechaque paramètre est une expression ou un opérateurchaque paramètre est une expression ou un opérateur
Opérations arithmétiques entre chaînes numériques :Opérations arithmétiques entre chaînes numériques :+ - / * %+ - / * %
Opérations de comparaions :Opérations de comparaions := != < > <= >== != < > <= >=
Sélection d’expressionSélection d’expressionexpr1 | expr2 vaut expr1 si non nul et n’est pas une chaine expr1 | expr2 vaut expr1 si non nul et n’est pas une chaine vide, expr2 sinonvide, expr2 sinonexpr1 & expr2 vaut expr1 si mes 2 expressions ne sont ni nulles expr1 & expr2 vaut expr1 si mes 2 expressions ne sont ni nulles ni vides, 0 sinonni vides, 0 sinon
Shell : autres variablesShell : autres variables
Autres variables initialisées par le shellAutres variables initialisées par le shell$$ $$ numéro du processus courantnuméro du processus courant$!$! Numéro du dernier processus backgroundNuméro du dernier processus background$?$? Code retour de la dernière commande exécutéeCode retour de la dernière commande exécutée
Le code retour d’une liste de commande est le code retour de la Le code retour d’une liste de commande est le code retour de la dernière commande de la listedernière commande de la liste
0 : OK0 : OK!=0 : Problème!=0 : Problème
Ce code retour peut être utilisé dans les structures de contrôle à la Ce code retour peut être utilisé dans les structures de contrôle à la manière d’un booléenmanière d’un booléen
Initialisation explicite du code retour dans uns sipt shellInitialisation explicite du code retour dans uns sipt shellexit : le code retour de la procédure sera celui de la dernière commande exit : le code retour de la procédure sera celui de la dernière commande
exécutée avant exitexécutée avant exit
exit valeur : le code retour de la procédure sera valeurexit valeur : le code retour de la procédure sera valeur
Shell : ifShell : if
L’alternative : ifL’alternative : ifif <expression>if <expression>
then <liste de commandes>then <liste de commandes>else <liste de commandes>else <liste de commandes>
fifi
Exemple :Exemple :if cc _0 *.cif cc _0 *.c
then pack *.cthen pack *.celse rm *.oelse rm *.o
fifi
Shell : || et &&Shell : || et &&
Exécution conditionnelle : || et &&Exécution conditionnelle : || et &&Pour éviter l’usage explicite du ifPour éviter l’usage explicite du if
Exemple :Exemple :rm xxrm xxls –l xx || echo Echecls –l xx || echo Echecls –l xx && echo Reussitels –l xx && echo Reussiteecho Reussi || ls –l xxecho Reussi || ls –l xxecho Pas de la && ls –l xxecho Pas de la && ls –l xx
La commande testLa commande test
La commande test permet :La commande test permet :D’exprimer des conditions sur des fichiersD’exprimer des conditions sur des fichiersD’effectuer des comparaisonsD’effectuer des comparaisons
2 formes2 formesTest expressionTest expression[ expression ][ expression ]
Le résultat d’un test est 0 si la Le résultat d’un test est 0 si la condition est remplie et différente condition est remplie et différente sinon. En shell, 0 est équivalent à vraisinon. En shell, 0 est équivalent à vrai
La commande testLa commande test
Conditions sur des fichiersConditions sur des fichiersexpr option nomexpr option nomoption :option :
-f : vrai si nom est un fichier-f : vrai si nom est un fichier-d : vrai si nom est un répertoire-d : vrai si nom est un répertoire-r : vrai si nom est un fichier lisible-r : vrai si nom est un fichier lisible-w : vrai si nom est un fichier modifiable-w : vrai si nom est un fichier modifiable-x : vrai si nom est un fichier exécutable-x : vrai si nom est un fichier exécutable
Comparaison de chainesComparaison de chainesstring1 = string2string1 = string2 égalitéégalitéstring1 != string2string1 != string2 inégalitéinégalité-n string-n string vraie si longueur de string != 0vraie si longueur de string != 0
La commande testLa commande test
Comparaisons nmériquesComparaisons nmériquesn1 -eq n2n1 -eq n2 vrai si n1 = n2vrai si n1 = n2 -ne-ne vrai si n1 != n2vrai si n1 != n2
-lt-lt vrai si n1 < n2vrai si n1 < n2 -gt-gt vrai si n1 > n2vrai si n1 > n2 -ge -ge vrai si n1 >= n2vrai si n1 >= n2
Connecteurs logiquesConnecteurs logiques!! : non: non-a-a : and: and-o-o : or: or\( … \) : pour associer des expressions\( … \) : pour associer des expressions
Shell : while et untilShell : while et until
While : tant que la condition est vraieWhile : tant que la condition est vraiewhile <expression>while <expression>
do <liste de commandes>do <liste de commandes>DoneDone
Until : itération tant que la condition est Until : itération tant que la condition est faussefausse
until <expression>until <expression>do <liste de commandes>do <liste de commandes>
donedone