Machine Translated by Google
Programmation Shell
Machine Translated by Google
Scripts Shell (1)
u Fondamentalement, un script shell est un fichier texte sous Unix
commandes dedans.
u Les scripts Shell commencent généralement par un # ! et une coquille
nom
– Par exemple : #!/bin/sh
– Si ce n'est pas le cas, le shell actuel de l'utilisateur sera utilisé
u N'importe quelle commande Unix peut être insérée dans un script shell
– Les commandes sont exécutées dans l'ordre ou dans le flux
déterminé par les instructions de contrôle.
u Différents shells ont des structures de contrôle différentes
Le #! la ligne est très importante –
Nous écrirons des scripts shell avec le shell Bourne (sh)
Machine Translated by Google
Scripts Shell (2)
uPourquoi écrire des scripts shell ?
– Pour éviter les répétitions :
vSi vous effectuez une séquence d'étapes avec
des commandes Unix standard encore et encore,
pourquoi ne pas tout faire avec une seule commande ?
– Pour automatiser les tâches difficiles :
De nombreuses commandes comportent des options
subtiles et difficiles que vous ne voulez pas comprendre
ou mémoriser à chaque fois.
Machine Translated by Google
Un exemple simple (1)
u tr abcdefghijklmnopqrstuvwxyz \
thequickbrownfxjmpsvalzydg < file1 > file2 –
« crypte » le fichier1 dans le fichier2
u Enregistrez cette commande dans des fichiers de script shell :
– myencrypt #!/
bin/sh
tr abcdefghijklmnopqrstuvwxyz \
thequickbrownfxjmpsvalzydg –
mydecrypt #!/
bin/sh
tr thequickbrownfxjmpsvalzydg \
abcdefghijklmnopqrstuvwxyz
Machine Translated by Google
Un exemple simple (2)
uchmod les fichiers à être exécutables ;
sinon, vous ne pourriez pas exécuter les scripts
obelix[3] > chmod u+x myencrypt mydecrypt
uExécutezles comme des commandes normales :
obelix[4] > ./myencrypt < fichier1 > fichier2
obelix[5] > ./mydecrypt < fichier2 > fichier3
obelix[6] > diff fichier1 fichier3
N'oubliez pas : ceci est nécessaire
lorsque "." n'est pas sur le chemin
Machine Translated by Google
Variables du shell Bourne
uRappelezvous : les variables du shell Bourne sont
différentes des variables de csh et tcsh !
– Exemples en sh :
CHEMIN=$CHEMIN:$HOME/bin
Remarque : pas
HA=1 $ d'espace autour =
PHRASE="Maison sur la colline"
export PHRASE Faire de PHRASE une
variable d'environnement
Machine Translated by Google
Affectation d'une sortie de commande à une variable
uÀ l'aide de guillemets, nous pouvons attribuer
la sortie d'une commande à une variable :
#!/bin/sh
fichiers=`ls`
echo $files
uTrès utile en calcul numérique : #!/bin/sh
valeur=`expr 12345 + 54321` echo
$valeur
Machine Translated by Google
Utiliser expr pour les calculs
u Variables comme arguments :
% nombre=5
% count=`expr $count + 1` %
echo $count
6
– Les variables sont remplacées avec leurs valeurs par le shell !
u expr prend en charge les opérateurs suivants :
– opérateurs arithmétiques : +,,*,/,
% – opérateurs de comparaison : <, <=, ==, !=,
>=, > – opérateurs booléens/
logiques : &, | –
parenthèses : (, ) – la priorité est la même que C, Java
Machine Translated by Google
Déclarations de contrôle
uSans instructions de contrôle, l'exécution dans un
script shell passe successivement d'une
instruction à la suivante.
uLes instructions de contrôle contrôlent le flux
d'exécution dans un langage de programmation.
uLes trois types d'instructions de contrôle les plus
courants : –
conditionnelles : if/then/else, case, ... –
instructions de boucle : while, for, jusqu'à, do, ...
– instructions de branchement : appels de sous
programmes (bons), goto (mauvais)
Machine Translated by Google
Boucles for
Les boucles ufor permettent la répétition d'une commande pour
un ensemble spécifique de valeurs
uSyntaxe :
for var in value1 value2 ...
faire
command_set
terminé
– command_set est exécuté avec chaque valeur de var
(value1, value2, ...) dans l'ordre
Machine Translated by Google
Exemple de boucle for (1)
#!/bin/sh #
timestable – imprimer une table de multiplication pour i en 1
23
faire
pour j dans 1 2
3
do value=`expr $i \* $j`
echo n "$value " done
écho
fait
Machine Translated by Google
Exemple de boucle for (2)
#!/bin/sh
# filepoke – ditesnous des trucs sur les fichiers
files= `ls `
for i in $files do
echo n "$i " grep
$i $i done
– Rechercher des noms de fichiers dans les fichiers du répertoire actuel
Machine Translated by Google
Exemple de boucle for (3)
#!/bin/sh
# filepoke – ditesnous des informations sur les
fichiers pour i
in * ; do echo n
"$i " grep $i
$i done
– Identique à la diapositive précédente, mais un
peu plus condensée.
Machine Translated by Google
Conditions
u Les conditions sont utilisées pour « tester » quelque chose.
– En Java ou C, ils testent si une variable booléenne est vraie ou
fausse.
– Dans un script shell Bourne, la seule chose que vous pouvez
tester est de savoir si une commande est « réussie » ou non.
u Chaque commande bien exécutée renvoie un code retour.
– 0 si c'est réussi
– Différent de zéro en cas d'échec (en fait 1..255)
– Nous verrons plus tard que cela est différent des conditions vrai/
faux en C.
Machine Translated by Google
L'instruction if
uForme simple : si
décision_command_1 alors
commande_set_1 grep renvoie 0 s'il trouve quelque chose qui
être
renvoie une valeur différente de zéro, sinon
uExemple : si
grep unix myfile >/dev/null alors
echo "C'est là"
être rediriger vers /dev/null afin que les
résultats "intermédiaires" ne soient pas
imprimés
Machine Translated by Google
si et sinon
si grep "UNIX" monfichier >/dev/null alors
echo UNIX se produit dans mon fichier
sinon
écho Non !
echo UNIX ne se produit pas dans mon fichier fi
Machine Translated by Google
si et elif
si grep "UNIX" monfichier >/dev/null alors
echo "UNIX apparaît dans le fichier"
elif grep "DOS" monfichier >/dev/null puis
echo "Unix ne se produit pas, mais DOS oui"
autre
echo "Personne n'est là" fi
Machine Translated by Google
Utilisation de pointsvirgules
uAu lieu d'être sur des lignes distinctes, les
instructions peuvent être séparées par
un pointvirgule (;)
– Par exemple : if
grep "UNIX" monfichier ; puis faites écho à "Compris" ;
fi – Cela fonctionne réellement n'importe où dans le
$cwd % cwd=
shell. ` mot de passe` ; cd $HOME ; ls ; cd
Machine Translated by Google
Utilisation du côlon
u Parfois, il est utile d'avoir une commande
qui ne fait « rien ». u La
commande : (deuxpoints) sous Unix ne fait rien #!/bin/sh
si grep unix mon fichier
alors
:
autre
echo "Désolé, Unix n'a pas été trouvé"
être
Machine Translated by Google
La commande test – Tests de fichiers
u test –f file le fichier existe til et n'estil pas un répertoire ? u test
d file le fichier existetil et estil un répertoire ? u test –x
fichier le fichier existetil et estil exécutable ? u test –s le
fichier existe til et faitil plus de 0 octet ?
#!/bin/sh
compte=0
pour moi dans
* ; faire si test –x $i;
alors count=`expr $count + 1` fi
done
echo Total de $count fichiers exécutables.
Machine Translated by Google
La commande test – Tests de chaînes
u test –z la chaîne est une chaîne de longueur 0 ? u
test string1 = string2 estce que string1 est égal à string2 ? vous testez
string1 != string2 n'est pas égal ? u Exemple : si
test z
$REMOTEHOST alors
:
autre
DISPLAY="$REMOTEHOST:0" exporter
DISPLAY fi
Machine Translated by Google
La commande test – Tests entiers
uLes entiers peuvent également être comparés :
– Utilisez eq, ne, lt, le, gt, ge
uPar exemple : #!/bin/
sh
le plus petit = 10 000
pour je dans 5 8 19 8 7 3; faire
si test $i lt $le plus petit ; alors le
plus petit=$i
être
fait
echo $le plus petit
Machine Translated by Google
Utilisation de [ ]
u Le programme de test a un alias comme [ ]
– Chaque support doit être entouré d'espaces !
– C’est censé être un peu plus facile à lire. u Par exemple :
#!/bin/sh
le plus petit = 10 000
pour i dans 5 8 19 8 7 3 ; faire
if [ $i lt $le plus petit ] ; alors le
plus petit=$i
être
fait
echo $le plus petit
Machine Translated by Google
La boucle while
Les boucles uWhile répètent les instructions tant que
la prochaine commande Unix réussit.
u Par exemple : #!/
bin/sh
je = 1
somme=0
while [ $i le 100 ]; do
sum=`expr $sum + $i` i=`expr
$i + 1` done echo
La
somme est $sum.
Machine Translated by Google
Les boucles jusqu'à
ce que les boucles uUntil répètent les instructions jusqu'au prochain
La commande Unix a réussi.
u Par exemple :
#!/bin/sh
x=1
jusqu'à [ $x gt 3 ]; faire
echo x =
$xx=`expr $x + 1`
terminé
Machine Translated by Google
Arguments de ligne de commande (1)
u Les scripts Shell ne seraient pas très utiles si nous ne pouvions pas leur
transmettre des arguments sur la ligne de commande
u Les arguments du script Shell sont « numérotés » à partir de la gauche
à droite
– $1 – premier argument après la commande
– $2 deuxième argument après la commande
–
... jusqu'à 9 $
– Ils sont appelés « paramètres positionnels ».
Machine Translated by Google
Arguments de ligne de commande (2)
uExemple : obtenir une ligne particulière d'un fichier
– Écrivez une commande au format :
getlineno numéro de ligne nom de
fichier #!/bin/sh
tête 1$ 2$ | tail 1
uAutres variables liées aux arguments : v$0 nom de la
commande exécutée v$* Tous les arguments
(même s'il y en a plus de 9) v$# le nombre
d'arguments
Machine Translated by Google
Arguments de ligne de commande (3)
u Exemple : imprimer les fichiers les plus anciens d'un répertoire
#! /bin/sh
# plus ancien examine les parties les plus anciennes d'un répertoire
COMBIEN = quart de travail
de 1 $
ls lt $* | queue +2 | tail $HOWMANY
u La commande shift décale tous les arguments vers la gauche – $1 =
$2, $2 =$3, $3 = $4, ... – $1 est
perdu (mais nous l'avons sauvegardé dans $HOWMANY)
– La valeur de $# est modifiée ($# 1) –
utile lorsqu'il y a plus de 9 arguments u La commande
« tail +2 » supprime la première ligne.
Machine Translated by Google
En savoir plus sur les variables Bourne Shell (1)
uIl existe trois types de variables de base dans
un script shell :
– Variables de position...
v$1, $2, $3, ..., $9 –
Variables de mots clés...
vLike $PATH, $HOWMANY et tout ce que nous
pouvons définir.
– Variables spéciales...
Machine Translated by Google
En savoir plus sur les variables Bourne Shell (2)
uVariables spéciales :
– $*, $# tous les arguments, le nombre de
les arguments
– $$ l'identifiant du processus du shell actuel
– $? valeur de retour du dernier premier plan
processus à terminer
nous en reparlerons plus tard
– Il y en a d’autres avec qui vous pourrez vous renseigner
mec merde
Machine Translated by Google
Lecture des variables à partir de l'entrée standard (1)
u La commande read lit une ligne d'entrée du
terminal et l'affecte aux variables données en
arguments
u Syntaxe : lire var1 var2 var3 ...
vAction : lit une ligne d'entrée à partir de l'entrée standard
vAssignez le premier mot à var1, le deuxième mot à var2, ...
vLa dernière variable récupère tous les mots en excès sur le
doubler.
Machine Translated by Google
Lecture des variables à partir de l'entrée standard (2)
u Exemple : %
lu XYZ
Voici quelques mots en entrée %
echo $X
Ici
% écho $Y
sont
% echo $Z
quelques mots en entrée
Machine Translated by Google
L'exposé du cas
u L'instruction case prend en charge plusieurs voies
branchement basé sur la valeur d’une seule chaîne.
u Forme générale :
chaîne de cas
dans le
modèle 1) command_set_11
;;
modèle2)
command_set_2
;;
…
esac
Machine Translated by Google
cas Exemple
#!/bin/sh
'
echo n 'Choisissez la commande [14] > lire
la réponse
echo
cas $réponse en
"1") Utilisez le symbole de tuyau « | » comme une
date logique ou entre plusieurs choix.
;;
"2"|"3") mot
de passe
;;
"4")
ls Fournissez un cas par défaut lorsqu’aucun
autre cas ne correspond.
;;
*) echo Choix illégal !
;;
esac
Machine Translated by Google
Redirection dans les scripts Bourne Shell (1)
u L'entrée standard est redirigée de la même manière
(<). u La sortie standard peut être redirigée de la même manière (>).
– Peut également être dirigé en utilisant la
notation 1> – Par exemple : cat x 1> [Link]
(uniquement stdout) u L'erreur standard est redirigée en
utilisant la notation 2> – Par exemple : cat xy 1>
[Link] 2> stderr. txt u La sortie standard et l'erreur standard pe
redirigé vers le même fichier en utilisant la notation 2>&1 – Par
exemple : cat xy > [Link] 2>&1
u La sortie standard et l'erreur standard peuvent être redirigées
vers la même commande en utilisant une notation similaire
– Par exemple : chat xy 2>&1 | texte greffé
Machine Translated by Google
Redirection dans les scripts Bourne Shell (2)
u Les scripts Shell peuvent également fournir une entrée standard à
commandes à partir du texte intégré dans le script luimême.
u Forme générale : commande << mot
– L'entrée standard pour la commande suit cette ligne jusqu'à
la ligne commençant par mot, mais sans l'inclure.
u Exemple :
#!/bin/sh
grep 'bonjour' << EOF Seules ces deux lignes seront mises
en correspondance et affichées.
Ceci est un exemple de texte.
Voici une ligne avec bonjour dedans.
Voici une autre ligne avec bonjour.
Plus de lignes avec ce mot.
EOF
Machine Translated by Google
Un exemple de script Shell (1)
uSupposons que nous ayons un fichier appelé
[Link] contenant les notes suivantes des étudiants :
091286899 90 H. Blanc
197920499 80 J. Brun
899268899 75 R. Vert
……
uNous souhaitons calculer des statistiques sur
les notes dans ce fichier.
Machine Translated by Google
Un exemple de script Shell (2)
#!/bin/sh
somme=0; nombre d'échecs = 0 ; compte=0 ;
tout en lisant le nom de la classe du numéro d'étudiant ; do
sum=`expr $sum + $grade` count=`expr
$count + 1` if [ $grade lt 50 ]; alors
countfail=`expr $countfail + 1`
être
done
echo La moyenne est `expr $sum / $count`. echo $countfail les
étudiants ont échoué.
Machine Translated by Google
Un exemple de script Shell (3)
uSupposons que le script shell précédent ait été
enregistré dans un fichier appelé statistiques.
uComment pourrionsnous l’exécuter ?
uComme d'habitude, de plusieurs
manières... – % cat [Link] |
statistiques – % statistiques <[Link]
uNous pourrions également simplement exécuter des
statistiques et fournir des notes via une entrée standard.