Flyerenv

06 avril 2006

Bourne Again SHell

Un de mes premiers amours est bash. Il reste un langage de script de prédilection lorsqu'il s'agit de manipuler des fichiers (leurs noms et leurs emplacements) ou encore lorsqu'il s'agit de lancer une suite de commandes. Certains vous diront leur préférence pour zsh mais je ne le connais pas.

Je ferai l'impasse sur les différentes astuces du style xargs, cd $(dirname "$0"), declare -a, trap, sed | grep | cut | sort | uniq | head | tail, for i in $(seq 1 10), set -xv ou fonctions de 3 lignes simplissimes... mais si vous me posez une question j'essairai de vous répondre.

L'idée est d'archiver les commandes ou fonctions difficiles ou tout du moins qui ne se refond pas en 10 secondes.

Fonctions de date:

#Afficher une belle date
$> date +%A-%d-%B-%G_%T

Fonctions de variables:

Exemple:

#Transforme tous les / en \/
SOURCE=/tmp/toto
$> sedise DESTINATION SOURCE

#Enlever le dernier caractère d'une variable
$> DESTRINATION=${SOURCE:0:$((${#SOURCE}-1))}

Code:

function sedise
{
eval "$1=\${$2//\//\\\/}"
}


Fonctions de contrôle des entrées utilisateur:

Exemples:

#on pose une question
$> demander "Quel est votre prénom" "$ALPHA" PRENOM
$> echo "Votre prénom est $PRENOM"

#on pose la même question mais en proposant une valeur par défaut
$> proposer "Quel est votre prénom" "$ALPHA" PRENOM Florent
$> echo "Votre prénom est $PRENOM"

#on pose la même question en proposant une valeur par défaut
#à la différence que si la question avait déjà été posée (plus haut
#dans le script ou alors dans une exécution précédente du script, on propose
#par défaut la précédente réponse de l'utilisateur
$> suggerer "Quel est votre prénom" "$ALPHA" PRENOM Florent
$> echo "Votre prénom est $PRENOM"

Code:

ALPHA="[^[:alnum:]._-]"
EMAILS="[^[:alnum:].@,-]"
RESEAUX="[^[:digit:].,/]"
MOTS="[^[:alnum:]. -]"
MIN="[^a-z0-9]"
NUM="[^0-9]"

demander (){
typeset DEManDER_TmpVAR__

while [ -z "$DEManDER_TmpVAR__" ] || $(echo "$DEManDER_TmpVAR__"|grep -q "$2")
do
echo -n "$1: "
read DEManDER_TmpVAR__
done
eval "$3=\"\$DEManDER_TmpVAR__\""
}


proposer (){
typeset PROpoSER_TmpVAR__='*'

while $(echo "$PROpoSER_TmpVAR__"|grep -q "$2")
do
echo -n "$1 [$4]: "
read PROpoSER_TmpVAR__
done
if [ -z "$PROpoSER_TmpVAR__" ]; then
eval "$3=\"$4\""
else
eval "$3=\"\$PROpoSER_TmpVAR__\""
fi
}


#fonction utilisée par suggerer
function ecrire_config
{
cat > config.sh <<EOF
VAR1="$VAR1"
VAR2="$VAR2"
#...
EOF
}

# sugerer "question" "controle" "nomVar" "defaut"
#
# Cette fonction est utile lors de la réexécution du script.
# Elle permet de récupérer les précédentes valeurs de sa configuration.
#
# si var -> proposer question controle nomVar var
# sinon -> si defaut -> proposer question controle nomVar defaut
# sinon -> demander question controle nomVar
#
# ATTENTION: ne pas appeler la fonction avec NOMVAR et $NOMVAR pour le défaut
suggerer (){
QUESTION="$1"
CONTROLE="$2"
NOMVAR="$3"
DEFAUT="$4"
eval VAR="\${$NOMVAR}"

if [ "$VAR" ]; then
proposer "$QUESTION" "$CONTROLE" "$NOMVAR" "$VAR"
else if [ "$DEFAUT" ]; then
proposer "$QUESTION" "$CONTROLE" "$NOMVAR" "$DEFAUT"
else
demander "$QUESTION" "$CONTROLE" "$NOMVAR"
fi
fi
ecrire_config
}



Fonctions relatives à Oracle

Exemple:
#Suppresion - création d'un user oracle
$> BDD_SYS_USER=system
$> BDD_SYS_PASS=manager
$> BDD_TNS=montnsname
$> delete_create_user_oracle NOM_USER PASS TBLSPACE TBLSPACE_TEMP

#Lister les tablespaces disponibles
$> BDD_SYS_USER=system
$> BDD_SYS_PASS=manager
$> BDD_TNS=montnsname
$> liste_tablespace

#Trouver quel user est présent dans un dump
$> cherche_user_dans_dump mon_fichier.dump

#Modifier les tablespace dans un dump
#requiert sed version 4 et plus
$> corrige_tablespace_dump mon_fichier.dump NOUVEAU_TABLESPACE

Code:
#utilise par delete_create_user_oracle
function sortie
{
echo "Erreur fatale: $1"
exit 255
}

# USER PASS TABLESPACE TMPTABLESPACE
function delete_create_user_oracle
{
LOG="/tmp/delete_create_user_oracle_$1.log"

if ! echo "
DROP USER $1
CASCADE;

CREATE USER $1
IDENTIFIED BY $2
DEFAULT TABLESPACE $3
TEMPORARY TABLESPACE $4
QUOTA UNLIMITED ON $4
QUOTA UNLIMITED ON $3;

GRANT CONNECT TO $1;

GRANT CREATE CLUSTER TO $1;

GRANT CREATE INDEXTYPE TO $1;

GRANT CREATE OPERATOR TO $1;

GRANT CREATE PROCEDURE TO $1;

GRANT CREATE SEQUENCE TO $1;

GRANT CREATE TABLE TO $1;

GRANT CREATE TRIGGER TO $1;

GRANT CREATE TYPE TO $1;

GRANT CREATE VIEW TO $1;

ALTER USER $1 DEFAULT ROLE ALL;

exit;

" | sqlplus -S "$BDD_SYS_USER/$BDD_SYS_PASS@$BDD_TNS" >"$LOG" ; then
sortie "Erreur lors de la création du user Oracle"
fi

if grep -v "^ORA-01918" "$LOG" | grep "^ORA-"; then
sortie "Erreur lors de la création du user Oracle"
fi
}


function liste_tablespace
{
echo
echo "Liste des tablespaces Oracle:"
echo -e "set heading off\n select TABLESPACE_NAME from user_tablespaces;\n exit\n" | sqlplus -S "$BDD_SYS_USER/$BDD_SYS_PASS@$BDD_TNS" | grep -v "^ *$\|rows selected"
echo
}


function cherche_user_dans_dump
{
grep --binary-files=text "^CONNECT " "$1" | head -1 | sed -e "s/CONNECT //g"
}

function corrige_tablespace_dump
{
BBD_IMPORT_TBS=$(grep --binary-files=text "^CREATE TABLE" "$1" | head -1 | sed -e "s/^.*TABLESPACE \"\([^\"]\+\)\".*/\1/g")

if [ "$2" != "$BBD_IMPORT_TBS" ]; then
echo "Rectification des tablespaces dans $1: replacement par $2..."
if ! sed -i -e "s/TABLESPACE \"\([^\"]\+\)\"/TABLESPACE \"$2\"/g" "$1"; then
sortie "Erreur lors de la modification du fichier $1"
fi
fi
}



D'autres fonctions utiles un jour sûrement...