Outils pour utilisateurs

Outils du site


programmation_bash

Bash

Lien:

Les bases

Un scripte Bash devient executable si on en première ligne:

#!/bin/sh

ou

#!/bin/bash

et qu'on fait:

$ bash mon_scripte.sh

ou

$ chmod a+x mon_scripte.sh
$ ./mon_scripte.sh

Variables

Declarer

Syntaxe: variable=chaine

IFACE=eth0
COMMENT="Interface reseau"
echo $COMMENT $IFACE

Ou pour eviter les ambuiguités:

echo ${COMMENT} ${IFACE}

Sortie:

Interface reseau eth0

Extraire sous-chaine

Syntaxe: ${variable:debut:longueur}

COMMENT="Interface reseau"
echo ${COMMENT:10}
echo ${COMMENT:5:4}

Sortie:

reseau
face

Motif

* n'importe quelle _chaine_ de caracteres
? n'importe quelle caractere
[] liste de caractère

\* pour * ou \? pour ? ou \\
pour \

Elimination du début (préfixe)
Le plus petit: Syntaxe: ${variable#motif}

echo ${COMMENT#Inter}
echo ${COMMENT#*a}
echo ${COMMENT#???e}
echo ${COMMENT#[A-Z][a-z]}
echo ${COMMENT}

Sortie:

face reseau
ce reseau
rface reseau
terface reseau
Interface reseau

Le plus long: Syntaxe: ${variable##motif}

echo ${COMMENT##*a}

Sortie:

u

redirection

Lien: http://doc.async.com.br/abs-0.3/HTML/io-redirection.html

Lire , line a line, la sortie (stdout) d'une commande:

digitemp_DS2490 -q -t 0 -o 2 |
while read line; do
  echo "> $line"
done

regex

#!/bin/sh

ARG="$1"

if [[ "$ARG" =~ "^([[:alnum:]]*)=([[:digit:]]*)$" ]]; then
  echo "${BASH_REMATCH[1]}"
  echo "${BASH_REMATCH[2]}"
fi

Avec gnu bash ⇐ 3.1, test:

$ ./t option=1234
option
1234

Le problème, sous Lenny, ca ne fonctionnera plus a cause des “quote”… il faut les virer.
Quand ce n'est pas possible (a cause des espaces par exemple), il faut mettre le regex dans une variable.

Donc, ecrire sans “quote” :

...
if [[ "$ARG" =~ ^([[:alnum:]]*)=([[:digit:]]*)$ ]]; then
...
$ sh --version
GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.

Delimiteurs

Lien: http://www.debianadmin.com/delimiters-in-bash.html

Exemple:

#!/bin/sh

cat /etc/passwd | while read line; do

IFS=":"
read username pass auid agid agroup ahome ashell <<EOF
$line
EOF

echo "username=" $username
echo "ashell=" $ashell

done

unset IFS

#!/bin/sh

  
IFS=":"
read first_name last_name  <<< "$( echo 'hello:ducon' )"

echo "1: $first_name"
echo "2: $last_name"

unset IFS

Output du dernier exemple:

1: hello
2: ducon

LOCK

Realiser un LOCK sur un scripte…

Lien: http://bash-hackers.org/wiki/doku.php/howto/mutex

Pour resumer: la seule solution portable est d'utiliser “mkdir”

Voir aussi “trap” pour supprimer le “lock”

TRAP

Comment traper les signaux, ou simplement la sortie du script…

Lien: http://www.traduc.org/~gleu/ykerb/ch12.html

awk

/etc/passwd

 cat /etc/passwd | awk -F':' '{ printf("%s => %s uid:%s\n", $7, $1 , $3 ) }' 
programmation_bash.txt · Dernière modification : 2010/04/29 09:32 de thierry