====== Bash ====== Lien: *[[http://wooledge.org:8000/BashFAQ|BashFAQ]] ===== 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 < %s uid:%s\n", $7, $1 , $3 ) }'