- Accueil
- Info légales
- Aide (FAQ)
- Les tags de ce site
- Bloc note
- Articles techniques
- Notes system
- Divers articles
- Drupal
- Notes ITIL 2007
- Notes MS
- Dans le quartier...
- Emploi
- Recettes de cuisine et adresses gourmandes
- mes applis ubuntu préferées
- Divers acronymes du monde social
- Internet 2018
- P2 meublé à louer - quartier du Poteau 75018
- apcos - réseaux sociaux et outils
- Articles techniques
- Divers liens
- Fun
- Mon CV IT
- Nouveautés
Ecrire un script Bash -p1
le début
voir les autres shell dispo: cat /etc/shells Le shell du user est dans /etc/passwd (is (voir le shell du user avec sudo cat /etc/passwd | grep user))
Créer ce fichier texte (nommé hello_world.sh) puis ajouter droits pour exe (en cli): chmod 755 hello_world
#!/bin/bash
# commentaire
echo "Hello World!"
path
./hello_world fonctionne (ou chmod u+x puis sh hello_world.sh). Voir le PATH courant du shell: echo $PATH
Ajouter un path: export PATH=$PATH:directory ou encore l'ajouter dans .bash_profile (ou .profile pour 14 LTS)
Ex: echo 'export PATH=$PATH:/home/user/mes_prog' >> /home/user/.bashrc
Note: on peux aussi utiliser /etc/environment
environnements
quand on se logue, le bash lit la conf "scripts de startup" pour tous les users. Puis sont lus les fichier de conf du user (/home/user). 2 types de login shell: login shell session (on entre login user et pw) et non-login shell session (GUI)
Login shells session lit
Fichier |
Contient |
/etc/profile | script de configuration globale, appliquée à tous les users |
~/.bash_profile | Conf du user. On peux ajouter ou supplanter /etc/profile |
~/.bash_login | Si ~/.bash_profile n'est pas trouvé, bash essaie de le lire |
~/.profile | Si ni ~/.bash_profile ni ~/.bash_login n'est trouvé, bash essaie de le lire. C'est habituel sur les debian (dont Ubuntu) |
Non-login shell sessions lisent ces fichiers de conf
File |
Contents |
/etc/bash.bashrc | script de configuration globale, appliquée à tous les users |
~/.bashrc | A user's personal startup file. Can be used to extend or override settings in the global configuration script. |
En plus de ceci non-login shells héritent de l'environnement du processus parent (souvent une session login shell).
Si ~/.bashrc existe alors lit ~/.bashrc
ex simples | synthaxe |
if [ -f ~/.bashrc ]; then . ~/.bashrc fi if true; then echo "It's true."; fi |
if commands; then commands [elif commands; then commands...] [else commands] fi |
alias (de commandes): alias name=value
Etre dans son dossier (/home/user) pour ajouter à la fin de .bashrc : alias l='ls -l'
alias today='date +"%A, %B %-d, %Y"'
Les alias ajoutés directement en ligne de commande... sont perdus en fermant la session => les ajouter ds fichier de conf .bashrc, quitter fenêtre et c'est chargé. Lors cli: alias liste les alias courrant.
Pratique aussi, la variable CDPATH
, qui permet de rechercher avec TAB un dossier habituel. Avec, dans .bashrc par ex : export CDPATH=".:/home/user/dossier-favori"
quand on fait un cd, il cherche dans le dossier courrant puis dans /home/user/
dossier-favori
cf http://damien.pobel.fr/post/etre-a-l-aise-avec-bash-2
Fonctions du shell
en cmd coller ceci puis saisir today
today() {
echo -n "Today's date is: "
date +"%A, %B %-d, %Y"
}
() fonctionne de façon à ce qu'on puisse saisir en cmd la fonction (jusqu’à ce qu'on ferme la session. Coller cette fonction en bas de .bashrc
Scripts here
source: http://linuxcommand.org/lc3_wss0030.php
command << token contenu utilisé en paramètre input de la command token
En remplaçant << par <<- bash ignore les tabul de l'indentation (mise en forme) et garde les espaces
#!/bin/bash |
#!/bin/bash |
cat <<- _EOF_
<body> |
titre="My System Information"
cat <<- _EOF_
<body> |
variables
La string My System Information est en double. On la remplace par une variable $titre. Quand bash voit $ il le remplace par le contenu de la var. $HOSTNAME est une var d'environnement (voir la liste avec printenv). On note des constantes en maj.
Initialisation: pas d'espaces près du =. right_now=$(date +"%x %r %Z") affecte à right_now dès initialisation valeur. On peux les imbriquer (ex: time_stamp="Updated on $right_now by $USER")
<p>Updated on $(date +"%x %r %Z") by $USER</p>
$() demande au shell de calculer car date +"%x %r %Z" donne date & h courante
sous scripts / fonctions shell
#!/bin/bash ##### Functions |
commentaires ini des var
mafonc() {} doit contenir une commande valide ou return |
system_info()
show_uptime() }
drive_space() }
home_space()
##### Main
|
technique de "stub" en attente de dev en cli, uptime donne date&h last reboot, nb users, charge proc récent => show_uptime() { echo "<h2>System uptime</h2>" echo "<pre>" uptime echo "</pre>" }
drive_space()
home_space() appel des fonctions déclarées plus haut |
exit (statut de sortie)
Scripts et fonctions retourne une valeur (entier de 0 à 255) à l'exe: le statut de l'exit. Si c'est 0 ok, voir man "exit status" pour les autres valeurs (KO car <>0).
Saisir en cli: | il retourne |
ls -d /usr/bin
|
/usr/bin
ls: cannot access /bin/usr: No such file or directory |
Voir if fi (ex simple 2) puis passer à test qui a 2 syntaxes (test expression ou [ expression ]) et sort avec 0 (ok) ou 1 (ko). Ex
if [ -f .bash_profile ]; then echo "Ok car tu as un .bash_profile." else echo "No .bash_profile !" fi |
Si .bash_profile est un fichier alors echo "ok" cas if vrai => test retourne 0 et aff ok sinon echo "ko" cas if faux => test retourne 1 et exe le else |
faire en cli "help test" (voir commentaire pour petit résumé des plus utiles et simples). Attention aux espaces: Si [ hsjkdk ]; Les espaces sont ajoutés pour meilleurs lisibilité, bash ne les traite pas (voir source en en à linuxcommand.org/lc3_wss0080.php). ; mettre plusieurs commandes à la suite (then et if sur meme ligne) ex: clear; ls
# Alternate form if [ -f .bash_profile ] then echo "You have a .bash_profile. Things are fine." else echo "Yikes! You have no .bash_profile!" fi |
# Another alternate form if [ -f .bash_profile ] then echo "You have a .bash_profile. Things are fine." else echo "Yikes! You have no .bash_profile!" fi |
La commande exit termine de suite le script, et définit le statut de sortie: exit 0 ou exit 1
On doit lancer ce script en root (car du sur /home/* fait des erreurs sans sudo). Pour tester le user, on va utiliser Id -u (retourne l'ID du user en valeur num (-u)) car elle retourne 0 si root.
if [ $(id -u) != "0" ]; then echo "Vous devez etre root pour lancer ce script" >&2 exit 1 fi |
&2 ex de redirection IO : vers standard error qu'on aurait pu mettre en début du script, mais on va plutot modifier home_space |
function home_space
{
# Only the superuser can get this information
if [ "$(id -u)" = "0" ]; then
echo "<h2>Home directory space by user</h2>"
echo "<pre>"
echo "Bytes Directory"
du -s /home/* | sort -nr
echo "</pre>"
fi
} # end of home_space
source (anglais) http://linuxcommand.org/lc3_wss0020.php
Avant de tester le script, voici les erreurs les plus communes... on va créer des scripts "trouble.bash" :)
Notes (anglais) scripts simples, avancé "ABS" http://www.tldp.org/guides.html
doc:
Fichier attaché | Taille |
---|---|
bash-beginners-guide.pdf | 1.14 Mo |
abs-guide.pdf | 2.6 Mo |