Introduction au shell (Bash) sous linux [débutants→intermédiaires].
L'objectif est de démystifier le shell, fournir une quelques commandes utiles, et présenter des fonctionnalités et des structures plus avancées (expansion des paramètres, tests, boucles, sous-commandes, etc.)
Présentation réaliser lors de l'install party Giroll.
1. Shell Linux
sans les coquilles
Débutant → intermédiaire
Édouard Lopez
CC BY-NC-SA
2. C'est quoi ?
● Une interface pourrie qui pète les yeux ?
○ Faux
○ configurez là!
● Un truc de barbu ?
○ Faux
○ Nolwenn (♀), addictif
● Un outil puissant et flexible ?
○ Oui,
○ On va voir ça
3. Outils de base
● le terminal
○ gnome-terminal,
○ konsole,
○ et d'autres
● un éditeur de texte
○ graphique:
■ gedit,
■ kate
○ ligne de commande:
■ vim
■ nano
4. Variations et diversité
● Sous linux vous avez le choix de votre shell :
○ POSIX
○ Shell
○ Bash (aujourd'hui)
○ Zsh
● Les fonctions de base sont similaires
● Attention à la portabilité !
● Connaître mon shell ?
5. Obtenir de l'aide
● RTFM
● Beaucoup de ressources en anglais
○ wikibooks
○ BashFAQ
● Soyez social !
○ Twitter
○ IRC: #bash, #zsh
6. RTFM
● Pour les barbus :
○ Depuis la ligne de commande
■ man <commande>
man echo
■ <commande> --help
echo --help
● Pour les gens normaux :
○ man sur le web
○ Google est ton ami
8. Concepts basiques
● Sensible à la casse : a ≠ A
● « Sans maîtrise, la puissance n'est rien » Pirelli
○ la force du shell c'est la flexibilité des commandes
● Options étendues :
○ ls -l -a -h
● Options condensées :
○ ls -lah
9. Commandes de base 1/2
● echo : affiche du texte ou une variable
○ echo $SHELL
● pwd : emplacement (print working dir)
● cd : changer de répertoire (change dir)
○ cd ~ # renvoi dans le $HOME
○ cd /tmp/
○ cd # renvoi dans le $HOME
● ls : lister les fichiers et répertoires (list)
○ ls -lah # fichiers cachés et taille en Ko/Mo
10. Commandes de base 2/2
● mv : déplacer ou renommer (move)
● touch : modifier la date ou le créer
● mkdir : créer un répertoire (make dir)
● rm : supprimer un fichier (remove)
● cat :
○ concatène des fichiers
○ envoi vers la sortie standard
● head : imprime le début d'un fichier
● tail : imprime la fin d'un fichier
● grep : trouve une expression dans un fichier
11. Chercher des fichiers : globs 1/2
● Caractères
○ * : tous les caractères, sans limite de longueur
■ ls ./*.csv
○ foo* : commence par foo
○ *foo* : contient la chaine foo
○ *.tar.gz : se termine par .tar.gz
○ foo? : caractère optionnel (foot, foob, et autres)
● Intervalle
○ [abc] : cherche parmi a, b ou c
○ [a-z] : cherche dans l'intervalle a à z
12. Chercher des fichiers : find 1/3
● Insensible à la casse
○ find ./ -iname "toto"
● Uniquement des dossiers
○ find ./ -type d -name "toto"
● Uniquement des fichiers
○ find ./ -type f -name "toto"
13. Chercher des fichiers : find 2/3
● Par date
○ -mtime : modification (fichier éditer)
○ -atime : accès (fichier lu)
○ -ctime : change (modification des droits du fichier)
●
Fichiers agés de plus de 30 jours
○ find ./ -mtime +30
● Par taille : fichier de plus de 1Ko
○ find ./ -size +1024c # c = caractères/octets
14. Chercher des fichiers : find 3/3
● Exécuter un action
○ find ./ -iname "toto" -exec echo {} ;
●
Attention à ce que vous faites !
○ find ./ -name "toto" -exec rn {} ;
● Aller plus loin :
○ http://mywiki.wooledge.org/UsingFind
15. Séquence de commandes
● Séquence de commandes indépendantes ;
○ cmd1 ; cmd2
○ chainer quelque soit le précédent résultat.
● Execution conditionnelle &&
○ cmd1 && cmd2
○ si cmd1 réussie, éxécute cmd2.
● Execution alternative ||
○ cmd1 || cmd2
○ si cmd1 échoue, éxécute cmd2.
16. Redirection et Tubes
● Redirections de flux
○
○
○
○
cmd > fichier : écrire dans un fichier.
cmd < fichier : lire un fichier.
cmd 2> fichier : rediriger les erreurs.
cmd & : créer un processus.
● Tubes (ou pipe)
○ cmd1 | cmd2
○ passé la sortie de cmd1 comme entrée de cmd2
■ wc -l fichier | cut -d' ' -f 1 # récupère le nb lignes
○ évite d'avoir un fichier temporaire.
17. Premier Script
● Créé son fichier
○ gedit ./mon-script.sh
● Indiquer l'interpréteur avec #! (shebang)
○ doit être sur la 1er ligne !
■ #!/usr/bin/env bash
■ #!/usr/bin/env sh
■ #!/usr/bin/env zsh
●
Commentaires, lignes commençant par #
○ # mon commentaire
18. Exécuter un script
● Vérifier la présence de l'interpréteur
○ #!/usr/bin/env bash
● Ajouter les droits d'execution
○ chmod u+x ./mon-script.sh
■ u = user
■ + = ajoute
■ x = execution
19. Conditions
● Si x alors y
○ if [[ condition ]]; then instruction 1; fi
○
[[ condition ]] && instruction
● Si x1 alors y1 Autre Si x2 Alors y2 Sinon y3
○ if [[ x1 ]]; then
y1
elif [[ x2 ]]; then
y2
else
y3
20. Options de Test
● Existence d'un fichier
○ [[ -e fichier ]] && echo "ok"
● Type de fichier: un dossier
○ [[ -d fichier ]] && echo "ok"
● Type de fichier: un fichier (ni un lien, ni un réperttoire)
○ [[ -f fichier ]] && echo "ok"
● -s (fichier existe et supérieur à 0 octets), -z (chaine
zero), -n (non-null), etc.
21. Tests multiples : Switch
case "$variable" in
"a")
cmds;;
"b")
cmds;;
val*) # le test peut être un glob: *.txt, *.jpe?g
*) # capture les autres cas
instructions;;
esac
22. Boucles : répéter du code
for i in "$listElements"; # un glob, un tableau
do
cmds
done
● La liste peut être :
○
○
○
○
un intervalle : {1..4}
glob : *.csv # éviter $(ls ...) [!]
un tableau : $array[@]
une sous-commande ⚠ # attention au format
● Il existe une syntaxe similaire au C :
○ for (( i=0 ; i<5 ; i++ )) ; do cmds ; done
23. Guillemets Simple ' ' (apostrophe)
● Chaine litéral : pas d'analyse
○ echo '$var' # affichera: $var
● Caractères spéciaux non-interprétés
○ n, t, etc.
● Échappement de l'apostrophe
○ '
● Aller plus loin : http://mywiki.wooledge.
org/Quotes
24. Guillemets Double " " (1/2)
● Permet certaines analyses
● Variables interprétées
○ echo "$var" # affichera le contenu de $var
● Expansion des paramètres
○ echo "${param/search/replace}"
● Expansion des expressions arithmétiques
○ echo $((3+4)) # inutile
● Substitutions de commande
○ echo "$(seq 3)"
25. Guillemets Double " " (2/2)
● Prévient certains comportements
● l'éclatement par mots
○ list="aa bb cc"
for i in "$list"; do echo "$i"; done
for i in $list ; do echo "$i"; done # éclatement
● l'expansion des globs
○ ls ./*
ls "./*" ⚠ # pas d'expansion du glob
● Enveloppe tout le résultat des substitutions
26. Besoin d'aide ?
● Linux Bash Shell Cheat Sheet
●
●
●
●
http://cli.learncodethehardway.org/bash_cheat_sheet.
pdf
FAQ de salon IRC #BASH
http://mywiki.wooledge.org/BashFAQ
Questions Bash sur StackOverflow
http://stackoverflow.com/questions/tagged/bash
The Bash-Hackers Wiki
http://wiki.bash-hackers.org/
The Grymoire - home for UNIX wizards
http://www.grymoire.com/Unix/