Bash

De Octet.ca

Syntaxe Bash et autres commandes pratique.

Sommaire

Identifier et effacer les fichiers identiques

fdupes -d REPERTOIRE

Tuer tous les processus d'un usager

Tuer les processus de l'usager qu'on est:

kill -9 -1

Obtenir le nombre de jours dans un mois donné

Pour le mois de février 2012 par exemple, utiliser:

cal 2 2012 |egrep -v [a-z] |wc -w

Dimension d'une liste de fichiers

Pour avoir le total des fichiers en octets:

find /path/ou/trouver/fichier -name "noms" -printf '%s\n' | awk 'BEGIN {Total=0} { Total += $1 } END { print Total }'

Aller ensuite sur ce site pour convertir le nombre obtenu dans quelque chose de décent: http://www.t1shopper.com/tools/calculate/

Sortie de la dernière commande bash

Pour récupérer la dernière valeur sortie d'une commande dans la commande suivante:

$ locate -r K3B.*ogg
/usr/share/sounds/KDE-K3B-Finish-Error.ogg
/usr/share/sounds/KDE-K3B-Finish-Success.ogg
/usr/share/sounds/KDE-K3B-Insert-Medium.ogg

Astheure on voudrait passer ces fichiers dans mplayer, mettons.

On peut utiliser $(!!) (ou `!!` sa forme ancestrale) pour_réexécuter_ la commande puis la substituer sur le commandline :

$ mplayer $(!!)

Deviendra donc

$ mplayer $(locate -r K3B.*ogg)

Voir aussi bash - automatically capture output of last executed command into a variable.

Changer l'extension

totopdf=bonjour.pdf
totopng=${totopdf%.*}.png

% : coupe à droite la plus petite string correspondant à .* %% : idem mais la plus longue string

  1. et ## idem mais à gauche

Ainsi :

totopdf=bonjour.bonsoir.pdf
${totopdf%.*}.png va donner bonjour.bonsoir.png MAIS ${totopdf%%.*}.png va donner bonjour.png 

for

for j in `seq 0 1500`; do
   ...
done

Boucle sur les lignes

while read LINE ; do  echo "$LINE" ; done < fichier.txt

if

Existence d'un fichier

Si un fichier existe, alors:

if [ -f  $FICHIER ]
   then
       echo $FICHIER "existe" 
fi

Si un fichier n'existe pas, alors:

if ! [ -f  $FICHIER ]
   then
       echo $FICHIER "n'existe pas" 
fi

Dans une boucle for

Ce test confirme si le fichier existe (source). Faire attention aux espaces autour des "[" et "]", ils sont importants.

for variable in titi toto;do if [ -f $variable ]; then echo "toto"; fi;done

Arithmétique

i=1
if [ "$i" -eq 1 ] ; then
 ...
fi

Opérations arithmétiques

Pour des opérations arithmétiques sur des variables, il faut utiliser les doubles parenthèses.

j=$(($i+1))

Pour gosser avec des entiers, il faut utiliser la commande expr:

expr 1 + 2

Faire la somme d'une série de nombres:

echo "96 96 105 146 288 96 74 71 92 96 126 102 74" |  awk '{tot=tot+$1} END {print tot}'

Si un fichier texte ne comprend que des nombres, on peut avoir le total avec la commande:

 awk '{tot=tot+$1} END {print tot}' fichier.txt

Convertir de majuscules à minuscules

echo $VARIABLE | tr '[:upper:]' '[:lower:]'

Comment faire pour avoir au moins 3 chiffres pour une variable

i=1
j=`printf "%02d" $i`
echo $j

Array

Déclaration

array=( zero one two three four five )

Appel

 echo ${array[0]}

Longueur

echo ${#array[@]}

Boucle sur les éléments

for i in `seq  $((${#array[@]}-1))`;do echo ${array[$i]};done

Arguments

Vérifier le nombre d'arguments

Dans un script bash, il arrive souvent que l'on veuille vérifier le nombre d'arguments. Le code suivant vérifie cela. De Check for number of arguments in bash.

# Check for proper number of command line args.

EXPECTED_ARGS=1
E_BADARGS=65

if [ $# -ne $EXPECTED_ARGS ]
then
 echo "Usage: `basename $0` {arg}"
 exit $E_BADARGS
fi

Répéter le même argument

Pour utiliser le même argument, nul besoin de l'écrire plusieurs fois:

commande argument_1 argument_1 argument_1

est la même chose que:

commande argument_1{,,}

Redirection dans un for loop

Essai-erreur :

for i in `seq 1 10`; do { R --vanilla --args input1 input2 output < code.r; }; done                         
for i in `seq 1 10`; do { R --vanilla --args input1 input2 output; } < code.r; done                         
for i in `seq 1 10`; do cat code.r | R --vanilla --args input1 input2 output; done     

PS1

Trucs pour la couleur du prompt en bash. Librement inspiré de ArchWiki et de Customizing BASH command prompt.

Pour avoir le nom de la machine en couleur rouge:

export PS1='\[\e[31;1m\]\h>\[\033[0m\] '

de couleur jaune:

export PS1='\[\e[33;1m\]\h>\[\e[0m\] '

\[\e[ commence le schéma des couleur
33;1  paire de couleurs à utiliser (33 - foreground;1 - background)
m\]   termine le code de couleur?
\h    le nom du domaine jusqu'au premier '.'
>     caractère >
\[\e[0m\]  fin du schéma de couleur.


Le code de couleur est le suivant:

foreground colors:
   * 30 black
   * 31 red
   * 32 green
   * 33 brown
   * 34 blue
   * 35 purple
   * 36 light
   * 37 gray
background colors:
   * 40 black
   * 41 red
   * 42 green
   * 43 brown
   * 44 blue
   * 45 purple
   * 46 light blue
   * 47 white
Outils personnels