Bash
De drev
Sommaire
Notes
Les espaces (ou leurs absence) sont important.
Notamment pour assigner une valeur a une variable, il n'y a pas d'espaces autour du signe égale.
Variables
Assignation
Depuis une commande
width=`identify -format "%w" $1`
ou
width=$(identify -format "%w" $1)
notes:
- la variable ne prend pas de $ durant la déclaration/assignation
- Pas d'espaces avant ou après le =
Depuis l'entrée standard
Commande read
echo "Enter something" ; read var ; echo "this is -> " $var
Enter something something this is -> something
Condition
if
( ) pour les entiers [ ] pour les chaines de caractere
if (( $width > 700*2 )); then else fi
case
case "$1" in start) start ;; stop) stop ;; status) status anacron ;; restart) stop start ;; condrestart) if test "x`pidof anacron`" != x; then stop start fi ;; *) echo $"Usage: $0 {start|stop|restart|condrestart|status}" exit 1 esac
Boucles
for
for i in {1..10}; do echo $i; done
for i in *.jpg; do echo $i; done
for i in *; do echo $i; done;
Boucle sur le contenu d'un fichier
for line in `cat file.txt`; do echo "$line"; done
- Boucler sur les repertoires
for d in *; do echo $d; done;
fonction
définir
function a_function(){ }
arguments
Bien qu'une fonction se déclare avec une paire de parentheses, les arguments se situent dans des variable $1, $2, $3, ...
valeur de retour
pour retourner une valeur, on peut faire un echo dans la fonction et assigner la valeur avec un val=$(a_function) lors de l'appel
function a_function(){ echo 'ok' } val=$(a_function) echo "value of val is " val
> Value of val is ok
REGEX
[[ ]]
- ne fonctionne qu'avec bash (et non sh)
#!/bin/bash files="*-0.jpg" regex="(.+?)-[0].jpg" for f in $files do [[ $f =~ $regex ]] name=${BASH_REMATCH[1]} echo $name done
sed
echo "FIRST SECOND" | sed 's/.* //'
SECOND
Desactiver la sortie ecran
Utile pour demander un mot de passe :
'stty -echo'
Chaîne de caractères
Pour les exemples qui suivent, une variable str est definit comme suit:
str="TEST"
longueur d'une chaîne
echo ${#str}
$ 4
replacer des characters
- Exemple: retirer tout les -
str="string-with-some-dash" echo ${str//-}
$ stringwithsomedash
Conserver le dernier caractère
${str: -1}
Toute la chaîne sauf le dernier caractère
${str::-1}
nom de fichiers sans extension
par exemple dans un répertoire
for i in *.jpg; do echo ${i%.*};done
Concatenation
De deux variables
$res=$var1 $var2
D'une variable et d'une chaîne de caractère
$res="$var I am a string"
renommer en masse
Exemple : .zip vers .cbz
find . -name "*.zip" -exec rename -v 's/\.zip$/\.cbz/' {} +