navigation
Home
admin
|
Bash
October 18th, 2016
|
| Table des matières |  |
Faire des additions
Différences entre accolades et parenthèses
Tests
Boucle
ssh dans une boucle
Fichiers de démarrage
Copier une arborescence (et conserver les droits)
Commenter plusieurs lignes
trap
Parcours d'un tableau
Parcours d'un fichier
Trucs et astuces
| Faire des additions |  |
Au choix :
il faut supprimer le blanc entre les parenthèses... (pb avec mon CMS..)
| Différences entre accolades et parenthèses |  |
Si on utilise des accolades, les commandes sont exécutées par le shell courant.
Si on utilise des parenthèses, les commandes sont exécutées par un shell fils (fork).
| Tests |  |
Opérateurs de test
Les opérateurs de tests disponibles sont,
pour les chaînes :
c1 = c2, vrai si c1 et c2 sont égaux ;
c1 != c2, vrai si c1 et c2 sont différents ;
-z c, vrai si c est la chaîne vide ;
-n c, vrai si c n'est pas la chaîne vide.
Pour les nombres :
n1 -eq n2, vrai si n1 et n2 sont égaux ;
n1 -ne n2, vrai si n1 et n2 sont différents ;
n1 -lt n2, vrai si n1 est strictement inférieur à n2 ;
n1 -le n2, vrai si n1 est inférieur ou égal à n2 ;
n1 -gt n2, vrai si n1 est strictement supérieur à n2 ;
n1 -ge n2, vrai si n1 est supérieur ou égal à n2.
Pour les expressions :
! e, vrai si e est faux ;
e1 -a e2, vrai si e1 et e2 sont vrais ;
e1 -o e2, vrai si e1 ou e2 est vrai.
Source : http://fr.wikibooks.org/wiki/Programmation_bash/Tests
Note 1 :
"Une construction if/then teste si l'état de la sortie d'une liste de commandes vaut 0 (car 0 indique le « succès » suivant les conventions UNIX) et, dans ce cas, exécute une ou plusieurs commandes."
Note 2 :
"La construction [ [ ] ] est la version plus souple de [ ] dans Bash. C'est la commande étendue de test, venant de ksh88."
"Utiliser la construction [ [ ... ] ], au lieu de [ ... ] peut vous permettre d'éviter des erreurs de logique dans vos scripts. Par exemple, les opérateurs &&, | |, < et > fonctionnent à l'intérieur d'un test [ [ ] ] bien qu'ils génèrent une erreur à l'intérieur d'une construction [ ]."
Source : http://abs.traduc.org/abs-5.1-fr/ch07.html#dblbrackets
Opérateurs dexécution conditionnelle
if [ ... ]
then
echo "ok"
else
echo "nok"
fi |
Est équivalent à
[ ... ] && { echo "ok"; } | | { echo "nok" ; } |
| Boucle |  |
for i in $(seq 1 60) ;do cp titre.jpg rep/titre$i.jpg; done
|
Autre exemple : Tester si des machines sont actives ou non :
for i in $(seq 20 120) ;do ping -c 1 192.168.7.$i -w 1 ; done |
| ssh dans une boucle |  |
Si on met un ssh sans option particulière, l'exécution du ssh casse la boucle while.
Exemple de script :
CFGFILE="$1"
# sauvegardes
while read ligne
do
echo `date "+%Y-%m-%d-%H-%M"` - sauvegarde en cours de traitement : $ligne
ssh root@cri-bruno-test "uname -a"
done < $CFGFILE
|
Solution
il faut rajouter l'option -n au ssh.
le man :
-n Redirects stdin from /dev/null (actually, prevents reading from stdin). This must be used when ssh is run in the background. A common trick is to use this to run X11 programs on a remote machine. For example, ssh -n shadows.cs.hut.fi emacs & will start an emacs on shadows.cs.hut.fi, and the X11 connection will be automatically forwarded over an encrypted channel. The ssh program will be put in the background. (This does not work if ssh needs to ask for a password or passphrase; see also the -f option.)
| Fichiers de démarrage |  |
Quand bash est invoqué comme shell de connexion, les fichiers lus sont (dans cet ordre) :
/etc/profile
Une fois ce fichier lu, le shell lira un des fichiers suivants (il les cherche dans cet ordre. La recherche est stoppée quand un fichier est trouvé) :
~/.bash_profile
~/.bash_login
~/.profile
Quand bash est invoqué comme shell interactif (i.e. un shell avec lequel on va interagir : un terminal par exemple), les fichiers lus sont (dans cet ordre) :
/etc/bash.bashrc
~/.bashrc
Sources : http://stefaanlippens.net/bashrc_and_others
http://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html
| Copier une arborescence (et conserver les droits) |  |
permet de copier une arborescence mais les droits sur les fichiers sont perdus.
Une solution :
cd repertoire_origine
tar cvf - . | (cd repertoire_destination ; tar xvf -) |
| Commenter plusieurs lignes |  |
$ cat s1
echo ligne ok
: '
ligne commentée 1
ligne commentée 2
ligne commentée 3
'
echo ligne ok |
| trap |  |
trap commande liste_signal |
"Si le signal a pour valeur 0 (EXIT), la commande associée sera appelée lorsque le shell sera terminé. Il s'agit de l'utilisation la plus courante de trap dans un shell-script. On définit une fonction de nettoyage, et on l'associe au signal 0. Cela permet que même si le script est interrompu, on remette les choses en place avant de quitter."
Source http://www.c-sait.net/cours/scripts.php#opt
Exemple :
$ grep trap /etc/cron.daily/mlocate
trap "rm -f $LOCKFILE" EXIT |
| Parcours d'un tableau (bash v3) |  |
for i in ${!Tableau[@]}
do
echo ${Tableau[i]} # élément-zéro
# élément-un
# élément-deux
# élément-trois
#
# Tous les éléments de Tableau.
done |
Source : http://abs.traduc.org/abs-5.1-fr/ch34s02.html
| Parcours d'un fichier (bash v3) |  |
#! /bin/bash
while read line
do
echo "$line"
done < file.txt |
| Trucs et astuces |  |
Chemins d'accès
bash vous simplifie aussi la vie avec { et } qui vous permettent d'éviter de recopier certaines parties de la ligne de commande.
Comparez :
$ cp documents/programmes/HelloWorld.java documents/programmes/HelloWorld.java.backup |
avec :
$ cp documents/programmes/{HelloWorld.java,HelloWorld.java.backup} |
ou même :
$ cp documents/programmes/HelloWorld.java{,.backup} |
Source : http://www.think-underground.com/index.php/post/2005/12/04/126-quelques-astuces-bash
Accès au dernier paramètre d'un script
Pourquoi ?
$* : Tous les paramètres de position, vus comme un seul mot.
$@ : Identique à $*, mais chaque paramètre est une chaîne entre guillemets, c'est-à-dire que les paramètres sont passés de manière intacte, sans interprétation ou expansion. Ceci signifie, entre autres choses, que chaque paramètre dans la liste d'arguments est vu comme un mot séparé.
${chaine:position} : Extrait une sous-chaîne de $chaine à partir de la position $position.
Si le paramètre $chaine est « * » ou « @ », alors cela extrait les paramètres de position, [30] commençant à $position.
Source : http://abs.traduc.org/abs-5.0-fr/ch09s02.html
Taille d'une variable a
expr length "$a"
echo ${#a} |
Date de la veille
Insertion de quotes
Dans certaines commandes, on veut afficher un quote mais ce quota interfère avec la commande...
Pas clair ?
exemple : on veut encadrer un nom par des quotes grâce à awk.
awk '{print "nom : ' "$1" ' "}' fichier_liste_noms |
Mettre un antislash devant le quota ne fonctionne pas. Une solution est d'utiliser le codage hexadécimal du quote (\x27) :
awk '{print "nom : \x27 "$1" \x27 "}' fichier_liste_noms |
|
|
Contact
|
|---|
Pour m'envoyer un mail, Pour me laisser un commentaire :richard.brunooo chez gmail.com |  |
|
|