Aide $ help commande Ou sur page wab : http://www.tldp.org/LDP/abs/html/internal.html
Bashdb = BASH with Debugger : à récupérer sur http://bashdb.sourceforge.net/ Bashdb nécessite bash version 3 : récupérer les sources de bash et la doc sur http://www.gnu.org/software/bash/
Première ligne : #! /bin/bash
Exécuter un script sans avoir mis le droit x (et sans le faire précéder de ./) : $ source nom_du_script
Sinon, mettre le droit x : $ chmod u+x nom_du_script puis l'exécuter : $ ./nom_du_script
cf. man echo :
\a BEL
\
\n newline (saut ligne)
\b backspace (retour arrière)
\c sans saut de ligne
\f form feed
\r CR
\t tabulation
\v tab vertical
Attention : dans la commande echo, -e est indispensable pour interpréter les caractères précédés de \ : $ echo -e “abc\ndef” abc def $ echo -e “abc\bdef” abdef $ echo -e “abc\tdef” abc def $ echo -e “abc\fdef” abc
def
$ echo -e “abcde\rfg” fgcde
Entrer un caractère spécial dans une commande immédiate Par exemple pour initialiser la variable tab avec un caractère de tabulation, taper: tab=“ puis <ctrl><v> puis la touche tabulation.puis ”. Vérifier que la variable tab contient bien le caractère spécial :
echo “$tab” | od -a 0000000 ht nl
echo “1${tab}2” 1 2
# bash -vx ./monscript
dans le script : set -vx (active le débogage) set +vx (désactive le débogage)
Option de débogage : Nom Option Description No Exec -n Lit les commandes mais ne les exécute pas Verbose -v Affiche toutes les lignes au moment où elles sont lues par le shell Trace -x Affiche les commandes et leurs arguments lorsqu'elle sont exécutées
set -x envoie les messages vers stderr (fichier standard n° 2) set +x les supprime Pour récupérer les messages de stderr dans un fichier : ./monscript 2> /tmp/erreurs ou bien ./monscript 2&1 > /tmp/erreurs
Le fichier est lu ligne à ligne. Les lignes lues ne sont pas précédées du signe +, celles qui sont exécutées sont précédées de +
man ascii Exemples :
En octal : $ echo $'\125' U
En décimal $ echo $'\125' U
en hexadécimal : $ echo $'\x55' U
hexdump od
$ echo -n a |od -i 0000000 97 0000001
$ echo -n z |od -i 0000000 122 0000001
$ code=`echo -n a |od -i | awk ' {print $2} '` $ echo $code 97
http://www.livefirelabs.com/unix_tip_trick_shell_script/oct_2003/10132003.htm
“Internal Field Separator”, variable du shell. Par défaut contient 3 caractères : space, tab, et newline Utilisé pour délimiter les mots dans les commandes telles que read et set
$ echo “$IFS” | od -a 0000000 sp ht nl nl sp = space ht = horizontal tab nl = newline le dernier nl est généré par la commande echo, en effet : echo | od -a 0000000 nl
Pour que echo ne génère pas de “newline” $ echo -n “$IFS” | od -a 0000000 sp ht nl
Idem en octal : $ echo -n “$IFS” | od -b 0000000 040 011 012
OLDIFS=$IFS IFS=$'\n'
Test du contenu : echo “$IFS” | od -a 0000000 nl nl
Puis aprés utilisation remettre IFS à sa valeur initiale : IFS=$OLDIFS unset OLDIFS
usleep n ne fait rien pendant n microsecondes usleep 10000000 “ ” 10 secondes echo $SECONDS affiche le temps en secondes depuis le démarrage d'un shell, d'un script. Peut être remis à 0 : SECONDS=0
http://www.faqs.org/docs/bashman/bashref_55.html http://linuxreviews.org/beginner/Bash-Beginners-Guide/en/x4195.html et redirections : http://www.tldp.org/LDP/abs/html/x12886.html
Attention ! read ne retourne pas les caractères IFS (sp tab et nl, cf. ci-dessus) : car=“ ” echo -n “$car” | od -a ⇒ 0000000 sp mais : read -n 1 car # On tape sur la barre espace echo -n “$car” | od -a ⇒ 0000000 # Comme si on n'avait rien tapé !
Pour que read n'interprète pas ces caractères, modifier IFS.
echo “Entrez le nom du fichier :” read -e nom_fichier
while read line do echo $line done <fichier
Dans la boucle, stdin est redirigé vers le fichier, ce qui fait qu'une commande “read clavier” dans la boucle n'a aucun effet. Pour y remédier : (cf. redirections http://www.tldp.org/LDP/abs/html/x12886.html)
# duplique stdin dans le “file descriptor” 6 exec 6<&0
while read line do echo -n “Taper sur une touche” # lit sur le fd 6 read -s -n 1 touche <&6 # -s pas d'écho, -n 1 un seul caractère à taper echo echo echo “Contenu de la ligne : ” $line echo “Touche : ” $touche echo done <essai
# remet stdin comme avant la boucle et ferme le fd 6 exec 0<&6 6<&-
Exemples
for I in 1 2 3 ; do echo $I; done ou bien : for 1); do echo $I; done 1 2 3
Avec un fichier “films” contenant par exemple : Le train sifflera trois fois Merlin l'Enchanteur
$ j=0 ; for i in `cat films` ; do echo $i ; 2) ; done ; echo Il y a $j mots Le train sifflera trois fois Merlin l'Enchanteur Il y a 7 mots
Pour rompre le déroulement d'une boucle for, while ou until :
revient au début de la boucle
n = niveau de boucle n = 1 revient début de la boucle n = 2 revient au début de la boucle précédente etc. * break [n] o sort d'une ou n boucles o n = niveau de boucle comme ci-dessus * exit n o fin du script avec un code de sortie (n)
`` ⇒ sortie de la commade incluse dans `` Exemples : affectation de variable TOTO=`ls *.txt` echo $TOTO 0t.txt
''
=> prend l'expression plus ou moins littéralement !?
TOTO='ls *.txt' echo $TOTO ls 0t.txt
Recherche rapide : <Ctrl><R> chaîne_à_chercher
history affiche la liste des 500 dernières commandes history | grep chaine_à chercher affiche les commandes contenant “chaine_à_chercher” !20 Pour rappeler la commande n° 20 !p Pour rappeler la commande commençant par p (si plusieurs affiche toutes les commandes) !tel “ tel !-2 rappelle l'avant dernière commande
La liste des commandes semble être mémorisée dans le fichier .bash_history, mais les commandes $ cat .bash_history et $ history ne donnent pas le même résultat (sans doute une écriture différée des dernières commandes dans .bash_history) !
Pour effacer (par mesure de sécurité) l'historique : $ history -c et en plus supprimer le fichier .bash_history
!$ dernière commande
pour mémorise un chemin et y revenir. Pour pushd, passer un répertoire en argument, sinon message d'erreur : $ pushd -bash: pushd: no other directory. Pas d'argument pour popd.
Pour mémoriser l'emplacement actuel : $ pushd ./ (ou pushd .)