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 .bashrcalias 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
# sysinfo_page - A script to produce an HTML file

#!/bin/bash
# sysinfo_page - A script to produce an HTML file

cat <<- _EOF_
    <html>
    <head>
        <title>
        My System Information
        </title>
    </head>

    <body>
    <h1>My System Information</h1>
    </body>
    </html>
_EOF_

titre="My System Information"

cat <<- _EOF_
    <html>
    <head>
        <title> $titre</title>
    </head>

    <body>
    <h1>$titre  $HOSTNAME  </h1>
   <p>Updated on $(date +"%x %r %Z") by $USER</p>
   </body>
   </html>
_EOF_

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
# sysinfo_page - A script to produce a system information HTML file

##### Constants
TITLE="System Information for $HOSTNAME"
RIGHT_NOW=$(date +"%x %r %Z")
TIME_STAMP="Updated on $RIGHT_NOW by $USER"

##### Functions

commentaires

ini des var

 

 

mafonc() {} doit contenir une commande valide ou return

system_info()
{
    # Temporary function stub
    echo "function system_info"
}

show_uptime()
{

}

drive_space()
{

}

home_space()
{

}

 

##### Main

cat <<- _EOF_
  <html>
  <head>
      <title>$TITLE</title>
  </head>


  <body>
      <h1>$TITLE</h1>
      <p>$TIME_STAMP</p>
      $(system_info)
      $(show_uptime)
      $(drive_space)
      $(home_space)

  </body>
  </html>
_EOF_

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()
{
    echo "<h2>Filesystem space</h2>"
    echo "<pre>"
    df
    echo "</pre>"
}

home_space()
{
    echo "<h2>Home directory space by user</h2>"
    echo "<pre>"
    echo "Bytes Directory"
    du -s /home/* | sort -nr
    echo "</pre>"
}
du -s     aff le total (et non taille sous rep). à lancer en root (car du)
sort -nr  n= tri numérique r= ordre inverse

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
echo $?


ls -d /bin/usr
echo $?

/usr/bin
0

ls: cannot access /bin/usr: No such file or directory
2

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
PDF icon bash-beginners-guide.pdf1.14 Mo
PDF icon abs-guide.pdf2.6 Mo