# Codes utiles pour les scripts ## Emplacement des scripts Il est possible de récupérer le nom du script en cours d'exécution: ```bash $ cat > monscript << EOF #!/bin/bash echo "Nom du script:\$0" EOF $ cat monscript #!/bin/bash echo $0 $ chmod +x monscript $ ./monscript Nom du script:./monscript ``` Il est même possible récupérer son chemin absolu. Pour cela, ajoutez les lignes suivantes au début de votre script (juste après le *shebang*): ```bash _resolve_file_location(){ SOURCE="$1" while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink THE_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" SOURCE="$(readlink "$SOURCE")" [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located done THE_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" echo $THE_DIR } SCRIPT_DIR_PATH=$(_resolve_file_location "$0") SCRIPT_ABS_PATH=$SCRIPT_DIR_PATH/$(basename $0) echo "Mon chemin absolu : $SCRIPT_ABS_PATH" ``` ## Passages de paramètres Dans ce guide, nous allons voir comment passer des paramètres à un script, soit sous la forme d'une liste d'items séparés par des espaces, soit sous forme de paramètres tels que `-h` ou `--help`. ### Liste de paramètres Il est possible de lister les paramètres grâce à leur index: `$1`, `$2`, `$3`, etc. Il est également possible de boucler sur ces paramètres de la manière suivante: ```sh #!/bin/bash while [ $# -gt 0 ] ; do case "$1" in *) echo '$1='"$1" shift # Décale les arguments echo 'après shift $1='"$1" ;; esac done ``` Cette méthode est *destructive*: elle ne permet pas de récupérer les valeurs des paramètres. Par contre elle marche avec tous les shell (y compris les shells POSIX). #### Application Ecrivez un script qui prend une liste de fichiers en paramètres et qui affiche leur contenu dans la console. ### Liste d'arguments Il est possible de passer des arguments en paramètres. C'est-à-dire que l'on peut indiquer au shell à quoi correspond chaque paramètre. Par exemple, indiquer quel est le répertoire source et quel est le répertoire cible parmi les paramètres. Et indépendamment de l'ordre. Voici un script de démonstration: ```sh #!/bin/bash printHelp(){ echo "Un texte pour expliquer comment se servir de la commande" } OPTS=$(getopt -l help,destination:,source:,verbose hd:s:v $*) #Vérifie que les paramères donnés étaient corrects: if [ $? != 0 ] then echo "Erreur lors de l'interprétation des paramètres:getopt" printHelp exit 1 fi eval set -- "$OPTS" echo 'Les paramètres interprétés par getopt:'$* echo '$OPTS='$OPTS VERBOSE="0" while true ; do case "$1" in -d|--destination) DESTINATION="$2" shift ; shift ## Deux items: deux shift ;; -s|--source) SOURCE="$2" shift ; shift ;; -v) VERBOSE="1"; shift ;; -h|--help) printHelp exit 0 ;; --) shift; break ;; esac done #Maintenant on peut tester les paramètres qui restent while [ $# -gt 0 ] ; do case "$1" in *) echo '$1='"$1" ; shift ;; esac done echo '$SOURCE='$SOURCE echo '$DESTINATION='$DESTINATION ``` Lancez ce script en utilisant les manières suivantes: ```bash ./listeargs.sh Bonjour au revoir ./listeargs.sh --help Bonjour au revoir ./listeargs.sh --source Bonjour au revoir ./listeargs.sh --source Bonjour --destination au revoir ``` Que constatez-vous ? Lisez le manuel de la commande `getopt`. Que fait cette commande ? #### Applications ##### Scan avec filtrage d'OS Reprendre le script permettant de faire un scan approfondi. Ajoutez un paramètre `--os` (ou `-o`) qui permet de ne prendre en compte que les OS dont la chaîne de caractère correspond à la valeur de l'option. Par exemple: ```bash scan-deep -o windows ``` N'affichera que les machines dont l'OS est de type `windows`. ##### Copie avec modification La copie des fichiers `*.conf` contenus dans les dossiers commençant par `.data` doit maintenant se faire en remplaçant des valeurs. Ainsi, toutes les chaines de caractères commençant par `user=` seront remplacées par `user=` (remplacez `` par votre nom d'utilisateur). Ecrivez un script pour réaliser cela. Vous devrez utiliser des commandes comme `cat`, `sed`. La page de manuel `re_format` peut aussi vous aider. Les autres fichiers doivent être copiés sans modification.