Il est possible de récupérer le nom du script en cours d'exécution:
$ 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):
_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"
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.
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:
#!/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).
Ecrivez un script qui prend une liste de fichiers en paramètres et qui affiche leur contenu dans la console.
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:
#!/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:
./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 ?
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:
scan-deep -o windows
N'affichera que les machines dont l'OS est de type windows.
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=<monlogin> (remplacez <monlogin> 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.