|
Le Shell
C'est un interpréteur de commandes, qu'on nomme ainsi car il apparait
comme une coquille qui entoure le système.
On l'utilise principalement dans deux cas :
+ interface de lignes de commandes proposée à la connexion des utilisateurs,
+ langage de programmation pour créer d'autres programmes qu'on appelle des scripts.
En théorie, c'est la mĂȘme chose car on peut considérer qu'un Shell de
connexion est un programme dont le fichier de commande est la console
de l'utilisateur. Cela explique pourquoi on peut se déconnecter
par Control-D qui est en fait le caractère de fin de fichier.
Il est vitale de savoir que les minuscules et les majuscules ne sont
pas confondues en shell. Par convention, les noms des commandes sont
en minuscules et ceux des variables en majuscules.
Dans le texte suivant, l'icone indique une fonctionaité utile dans un script.
0 - Caractères spéciaux
1 - Variables
2 - Syntaxe des commandes
3 - Commandes sur les fichiers et les repertoires
4 - Commandes sur les fichiers
5 - Commandes sur les repertoires
6 - Commandes sur les fichiers textes
7 - D'autres commandes
8 - Les redirections
9 - Les tests
10 - Les boucles
0 - Caractères spéciaux
# commentaire, la suite de la ligne est ignorée
; séparateur d'instruction sur une mĂȘme ligne
& exécute la commande suivie de & en tĂąche de fond
( si on veut se déconnecter précéder la commande de nohup )
$! contient le n° de process.
pour faire la même chose apres coup
^Z
jobs
bg [N] # N le numero de job a mettre en tache de fond si plusieurs
` accent grave (en effet peu visible)
entoure une commande à exécuter d'abord pour donner
le résultat à une autre commande
ex: echo "il est `date +%Hh%M`"
avantageusement remplacé par $(...)
? remplace un caractère
* remplace plusieurs caractères
ex : ls a*
liste les fichiers commençant par a
ex : ls ?a*
liste les fichiers dont la deuxième lettre est a
\ "protège" un caractère spécial
ex : echo *
affiche tous les nom de fichier du répertoire courant
echo \*
affiche le caractère *
^C control C arrête une commande en cours
^J control J indique une fin de ligne
^D control D indique une fin de fichier ( permet de déconnecter )
Particularité en bash
la commande history affiche l'historique
mais sinon Ă tout moment:
flĂšche vers le haut rappel l'historique des commandes
^R recherche dans l'ihistorique
!! affiche est relance la derniĂšre commande mais pour voir:
echo !!
pour qu'une commande ne soit pas loggée dans l'historique il suffit de commence la ligne par un espace
1 - Variables
Les variables jouent un grand rĂŽle. Certaines peuvent ĂȘtre transmis aux
sous-programmes et forment ce qu'on appelle lâenvironnement.
Par contre, une variable définie dans un sous programme disparaĂźt la fin.
export NOM=toto ( met la variable dans l'environnement )
env ( affiche l'environnement )
ex : LOGNAME contient le nom de l'utilisateur
ex : HOME contient le nom du répertoire de connexion
ex : PATH contient les repertoire ou trouver les commandes exécutables
ex : PS1 contient le prompt ( qui est affiché à l'invite de saisie )
ex : PS1 contient le nom du repertoire courrant
ex : OLDPWD contient le nom du repertoire precedent
ex : LINENO contient le n° de ligne dans un script
L'usage des variables est un peu délicat :
VARIABLE="j'ai envie d'espaces "
echo $VARIABLE # les espaces sont concatenées
echo "${VARIABLE}ou non"
echo '$VARIABLE' # affiche $VARIABLE
Les variables 0 à 9 sont dites positionnelles :
$0 donne le nom du script,
$1 le premier argument ....
$# le nombre d'arguments
$* tous les arguments mais decoupe ceux contenant des espaces ( typiquement nom de fichier)
"$@" résout le problème
test "$1" || exec echo "$0 : erreur : parametre manquant"
test -f "$1" || exec echo "$0 : erreur : $1 n'et pas un fichier"
test -s "$1" || exec echo "$0 : erreur : le fichier $1 est inexistant ou vide"
set [...] (assigne les variable positionnelles )
shift (décale les variable positionnelles : 1 est perdu
(2 remplace 1, 3 remplace 2 ... )
echo "$0 : nous somme le $(date)" # remplace par le résultat de la commande
echo 2+2=$((2+2)) # effectue le calcul jusqu'à 2â¶âŽ
echo $n!=$(($(seq -s \* $n))) # la fameuse fonction factorielle grace Ă la commande seq[uence] ( jusqu'Ă 20! )
seq -s \* $n | bc
(echo 1; seq $n | sed 's/$/*/'; echo p) | dc
La variable $$ contient le numero du process :
nom_fichier$$ ( unique mais seulement sur la machine locale à un instant donné )
mktemp --dry-run nom_fichier_XXXXX # résoud le problème
FTEMP=$(mktemp) # crée un fichier dans /tmp
DIRTEMP=$(mktemp -d) # crée un repertoire
Il existe des tableaux :
VAR=(premier second troisieme); I=1; echo ${VAR[$I]}
astuce pour exploser une chaine dans un tableau de lettres
TAB=($(sed 's/./& /g' <<< abcd))
|