Upload
edouard-lopez
View
425
Download
1
Embed Size (px)
DESCRIPTION
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.
Citation preview
Shell Linuxsans les coquilles
Débutant → intermédiaire
Édouard Lopez CC BY-NC-SA
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
Outils de base
● le terminal○ gnome-terminal, ○ konsole, ○ et d'autres
● un éditeur de texte ○ graphique:
■ gedit, ■ kate
○ ligne de commande:■ vim■ nano
● 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 ?echo $SHELL
Variations et diversité
Obtenir de l'aide
● RTFM
● Beaucoup de ressources en anglais○ wikibooks○ BashFAQ
● Soyez social !○ Twitter○ IRC: #bash, #zsh
RTFM
● Pour les barbus :○ Depuis la ligne de commande
■ man <commande>man echo
■ <commande> --helpecho --help
● Pour les gens normaux :○ man sur le web○ Google est ton ami
Chemin Unix
● Chemin relatif○ courant : ./○ Parent : ../
● Chemin Absolue○ / : racine du système○ /chemin/vers/dossier/
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
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
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
○ grep 'expression' ./fichier
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
● Insensible à la casse○ find ./ -iname "toto"
● Uniquement des dossiers○ find ./ -type d -name "toto"
● Uniquement des fichiers○ find ./ -type f -name "toto"
Chercher des fichiers : find 1/3
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
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
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.
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.
○ tee : permet d'afficher un flux sans briser le tube.
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
● Remplacer ; par des retours à la ligne
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
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
y1elif [[ x2 ]]; then y2else y3fi
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.
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
Boucles : répéter du code
for i in "$listElements"; # un glob, un tableaudo
cmdsdone
● 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
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
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)"
Guillemets Double " " (2/2)
● Prévient certains comportements
● l'éclatement par mots○ list="aa bb cc"
for i in "$list"; do echo "$i"; donefor 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 ○ $()
Besoin d'aide ?
● Linux Bash Shell Cheat Sheethttp://cli.learncodethehardway.org/bash_cheat_sheet.pdf
● FAQ de salon IRC #BASHhttp://mywiki.wooledge.org/BashFAQ
● Questions Bash sur StackOverflowhttp://stackoverflow.com/questions/tagged/bash
● The Bash-Hackers Wikihttp://wiki.bash-hackers.org/
● The Grymoire - home for UNIX wizardshttp://www.grymoire.com/Unix/