Scripts Shell - Linux Administration
Scripts Shell - Linux Administration
Scripts Shell
Scripts Shell
Scripts Shell
On trouvera dans ce chapitre une initiation pratique au scripting Bash.
Les sections qui suivent dans ce chapitre s’inspirent notamment du livre Scripts shell Linux et
Unix de Christophe Blaess (https://www.blaess.fr/christophe/livres/scripts-shell-linux-et-unix/) qu’il est
conseillé d’acquérir. L’ouvrage est orienté embarqué mais convient parfaitement pour un
apprentissage précis, rapide, intéressant et dynamique.
https://linux.goffinet.org/administration/scripts-shell/ 1/35
05/01/2021 Scripts Shell - Linux Administration
shebang
variables positionnelles
variables internes
fonctions et programme principal
fin de script
test
conditions
boucles
débogage
~/.bashrc
Références et exemples
1.2. Shebang
Le shebang, représenté par #! , est un en-tête d’un fichier texte qui indique au système
d’exploitation que ce fichier n’est pas un fichier binaire mais un script (ensemble de commandes)
; sur la même ligne est précisé l’interpréteur permettant d’exécuter ce script. Pour indiquer au
système qu’il s’agit d’un script qui sera interprété par bash on placera le shebang sur la première
ligne :
#!/bin/bash
chmod +x script0.sh
https://linux.goffinet.org/administration/scripts-shell/ 2/35
05/01/2021 Scripts Shell - Linux Administration
$- : options du shell
$? : code de retour de la dernière commande
\$\$ : PID du shell
$! : PID du dernier processus lancé en arrière-plan
$_ : dernier argument de la commande précédente
Par exemple :
#!/bin/bash
# script1.sh
echo "Nom du script $0"
echo "premier paramètre $1"
echo "second paramètre $2"
echo "PID du shell " \$\$
echo "code de retour $?"
exit
./script1.sh 10 zozo
https://linux.goffinet.org/administration/scripts-shell/ 3/35
05/01/2021 Scripts Shell - Linux Administration
En début de script, on peut définir la valeur de départ des variables utilisées dans le script. Elles
ne sont connues que par le processus associé au lancement du script.
VARIABLE="valeur"
echo $VARIABLE
Il peut être utile de marquer les limites d’une variable avec les accolades.
echo ${VARIABLE}
Par exemple :
#!/bin/bash
# script2.sh
PRENOM="francois"
echo "dossier personnel /home/${PRENOM}"
exit
La commande read lit les valeurs entrées au clavier et les stocke dans une variable à réutiliser.
echo "question"
read reponse
echo $response
On peut aller plus vite avec read -p qui sort du texte et attend une valeur en entrée :
1.7. Fonctions
Une fonction est un bloc d’instructions que l’on peut appeller ailleurs dans le script. Pour déclarer
une fonction, on utilise la syntaxe suivante :
https://linux.goffinet.org/administration/scripts-shell/ 4/35
05/01/2021 Scripts Shell - Linux Administration
maFonction()
{
instructions
}
function ma_fonction {
instructions
}
La déclaration d’une fonction doit toujours se situer avant son appel. On mettra donc les
fonctions en début de script.
Par exemple :
#!/bin/bash
# script3.sh
read -p "quel votre prénom ?" prenom
reponse() {
echo $0
echo "merci $prenom"
exit 1
}
reponse
exit
2. Structures conditionnelles
2.1. Structure conditionnelle if/then
if condition ; then
commande1
else
commande2
fi
2.2. Tests
La condition pourra contenir un test. Deux manières de réaliser un test (avec une préférence
pour la première) :
https://linux.goffinet.org/administration/scripts-shell/ 5/35
05/01/2021 Scripts Shell - Linux Administration
[ expression ]
ou
test expression
Il y a beaucoup d’opérateurs disponibles pour réaliser des tests sur les fichiers, sur du texte ou
sur des valeurs arithmétiques. La commande man test donnera une documentation à lire avec
attention : tout s’y trouve.
Par exemple :
#!/bin/bash
# script4.sh test si $passwdir existe
passwdir=/etc/passwdd
checkdir() {
if [ -e $passwdir ]; then
echo "le fichier $passwdir existe"
else
echo "le fichier $passwdir n'existe pas"
fi
}
checkdir
exit
Variante : script4a.sh
On reprend la fonction checkdir qui lit la valeur de la variable donnée par l’utilisateur :
#!/bin/bash
# script4a.sh test si $passwdir existe
read -p "quel est le dossier à vérifier ?" passwdir
checkdir() {
if [ -e $passwdir ]; then
echo "le fichier $passwdir existe"
else
echo "le fichier $passwdir n'existe pas"
fi
}
checkdir
exit
https://linux.goffinet.org/administration/scripts-shell/ 6/35
05/01/2021 Scripts Shell - Linux Administration
1. Shebang
2. Commentaires
3. Fonction gestion de la syntaxe
4. Fonction(s) utile(s)
5. Corps principal
6. Fin
#!/bin/bash
# script5.sh structure de base d’un script
target=$1
usage() {
echo "Usage: $0 <fichier>"
echo "Compte les lignes d'un fichier"
exit
}
main() {
ls -l $target
echo "nombre de lignes : $(wc -l $target)"
stat $target
}
if [ $# -lt 1 ]; then
usage
elif [ $# -eq 1 ]; then
main
else
usage
fi
exit
https://linux.goffinet.org/administration/scripts-shell/ 7/35
05/01/2021 Scripts Shell - Linux Administration
execverif() {
if [ -x $target ] ; then
#('x' comme "e_x_ecutable")
echo $target " est exécutable."
else
echo $target " n'est pas exécutable."
fi
}
#! /bin/sh
# 01_tmp.sh
dir="${HOME}/tmp/"
if [ -d ${dir} ] ; then
rm -rf ${dir}
echo "Le dossier de travail ${dir} existe et il est effacé"
fi
mkdir ${dir}
echo "Le dossier de travail ${dir} est créé"
3. Boucles
3.1. Boucle for-do
Faire la même chose pour tous les éléments d’une liste. En programmation, on est souvent
amené à faire la même chose pour tous les éléments d’une liste. Dans un shell script, il est bien
évidemment possible de ne pas réécrire dix fois la même chose. On dira que l’on fait une boucle.
Dans la boucle “for-do-done”, la variable prendra successivement les valeurs dans la liste et les
commandes à l’intérieur du “do-done” seront répétées pour chacune de ces valeurs.
Supposons que nous souhaitions créer 10 fichiers .tar.gz factices, en une seule ligne :
Supposons que nous souhaitions renommer tous nos fichiers *.tar.gz en *.tar.gz.old :
https://linux.goffinet.org/administration/scripts-shell/ 8/35
05/01/2021 Scripts Shell - Linux Administration
#!/bin/bash
# script6.sh boucle
#x prend chacune des valeurs possibles correspondant au motif : *.tar.gz
for x in ./*.tar.gz ; do
# tous les fichiers $x sont renommés $x.old
echo "$x -> $x.old"
mv "$x" "$x.old"
#on finit notre boucle
done
exit
Script inverse
Voici le script inverse, c’est sans compter sur d’autres outils pour d’autres situations :
#!/bin/sh
# script6r.sh inverse
#x prend chacune des valeurs possibles correspondant au motif : *.tar.gz.old
for x in ./*.tar.gz.old ; do
# tous les fichiers $x sont renommés $x sans le .old
echo "$x -> ${x%.old}"
mv $x ${x%.old}
# on finit notre boucle
done
exit
while condition ; do
commandes
done
until condition ; do
commandes
done
https://linux.goffinet.org/administration/scripts-shell/ 9/35
05/01/2021 Scripts Shell - Linux Administration
until;do répète les commandes jusqu’à ce que la condition soit vraie, ou alors tant qu’elle est
fausse.
Exercice.
Supposons, par exemple que vous souhaitiez afficher les 100 premiers nombres (pour une
obscure raison) ou que vous vouliez créer 100 machines virtuelles.
#!/bin/bash
# script7.sh boucle while
i=0
while [ $i -lt 100 ] ; do
echo $i
i=$[$i+1]
done
exit
#!/bin/bash
# for ((initial;condition;action))
for ((i=0;i<100;i=i+1)); do
echo $i
done
exit
Demandons par exemple à l’utilisateur s’il souhaite afficher ou non les fichiers cachés du
répertoire en cours.
https://linux.goffinet.org/administration/scripts-shell/ 10/35
05/01/2021 Scripts Shell - Linux Administration
#!/bin/sh
# script8.sh case-esac
#pose la question et récupère la réponse
echo "Le contenu du répertoire courant va être affiché."
read -p "Souhaitez-vous afficher aussi les fichiers cachés (oui/non) : " reponse
#agit selon la réponse
case $reponse in
oui)
clear
ls -a;;
non)
ls;;
*) echo "Veuillez répondre par oui ou par non.";;
esac
exit
3.4. Divers
Boîtes de dialogue
On pourrait aussi s’intéresser à Whiptail :
https://en.wikibooks.org/wiki/Bash_Shell_Scripting/Whiptail
(https://en.wikibooks.org/wiki/Bash_Shell_Scripting/Whiptail) qui permet de créer des boîtes de dialogue.
Déboggage de script
On peut débogguer l’exécution du script en le lançant avec bash -x. Par exemple :
$ bash -x script7.sh
Etude de ~/.bashrc
Le fichier ~/.bashrc est lu à chaque connexion de l’utilisateur.
$ head ~/.bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
https://linux.goffinet.org/administration/scripts-shell/ 11/35
05/01/2021 Scripts Shell - Linux Administration
La valeur d’une variable est traitée par défaut comme une chaîne de caractère.
\ Antislash
L’antislash \ , qu’on appelle le caractère d’échappement, annule le sens de tous les caractères
génériques, en forçant le shell à les interpréter littéralement.
echo \$var
$var
echo "\$var"
$var
var=5
echo la valeur de la variable est $var
la valeur de la variable est 5
echo "la valeur de la variable est $var"
la valeur de la variable est 5
echo '\$var'
\$var
echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$
Cette variable liée à la session connectée est une variable d’environnement fixée dans le fichier
~/.bashrc .
Variables d’environnement
Des variables d’environnement sont disponibles dans toutes les sessions. Par exemple PATH
indique les chemins des exécutables :
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
printenv
Variables locales
Les variables locales ne sont accessibles que sur le shell actif. Les variables exportées ou globales
sont accessibles à la fois par le shell actif et par tous les processus fils lancés à partir de ce shell.
https://linux.goffinet.org/administration/scripts-shell/ 13/35
05/01/2021 Scripts Shell - Linux Administration
commande env
préceder de local la valorisation d’une variable dans une fonction afin d’en limiter sa
portée.
Variables globales
Commande export . La commande export rend la variable disponible dans tous les processus
enfant de celui qui l’a lancée. Ainsi placée dans un fichier lu au démarrage d’une session
“exportera” la valeur dans tous les shells “enfants”.
echo ${PATH}
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/francois/.local/bin:/home/francois/bin
echo ${PATH:16:7}
usr/bin
Recherche de motifs
Les caractères génériques englobent d’autres caractères :
echo ${PATH}
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/francois/.local/bin:/home/francois/bin
https://linux.goffinet.org/administration/scripts-shell/ 14/35
05/01/2021 Scripts Shell - Linux Administration
echo ${PATH#/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:}
/home/francois/.local/bin:/home/francois/bin
echo ${PATH#*sbin:}
/usr/sbin:/home/francois/.local/bin:/home/francois/bin
echo ${PATH##*sbin:}
/home/francois/.local/bin:/home/francois/bin
Extraction de la fin
Extraction de la fin retirant un motif selon ${variable%motif}
echo ${PATH}
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/francois/.local/bin:/home/francois/bin
echo ${PATH%/home/francois/.local/bin:/home/francois/bin}
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:
echo ${PATH%/home*}
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/francois/.local/bin:
echo ${PATH%%/home*}
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:
echo ${PATH/$HOME/\~}
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:~/.local/bin:/home/francois/bin
echo ${PATH//$HOME/\~}
/usr/lib64/qt-
3.3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:~/.local/bin:~/bin
https://linux.goffinet.org/administration/scripts-shell/ 15/35
05/01/2021 Scripts Shell - Linux Administration
#! /bin/sh
# 06_affiche_arguments.sh
echo 0 : $0
if [ -n "$1" ] ; then echo 1 : $1 ; fi
if [ -n "$2" ] ; then echo 2 : $2 ; fi
if [ -n "$3" ] ; then echo 3 : $3 ; fi
if [ -n "$4" ] ; then echo 4 : $4 ; fi
if [ -n "$5" ] ; then echo 5 : $5 ; fi
if [ -n "$6" ] ; then echo 6 : $6 ; fi
if [ -n "$7" ] ; then echo 7 : $7 ; fi
if [ -n "$8" ] ; then echo 8 : $8 ; fi
if [ -n "$9" ] ; then echo 9 : $9 ; fi
if [ -n "${10}" ] ; then echo 10 : ${10} ; fi
On obtient ceci :
0 : ./06_affiche_arguments.sh
1 : un
2 : deux
3 : trois
4 : quatre
5 : zozo
6 : petzouille
7 : sept
8 : huit
9 : neuf
10 : 10
On peut optimiser les opérations avec la commande shift qui décale les paramètres vers la
gauche (supprime le premier paramètre) :
https://linux.goffinet.org/administration/scripts-shell/ 16/35
05/01/2021 Scripts Shell - Linux Administration
#! /bin/sh
# 07_affiche_arguments_3.sh
while [ -n "$1" ] ; do
echo $1
shift
done
#! /bin/sh
# 08_affiche_arguments_4.sh
while [ $# -ne 0 ]; do
echo $1
shift
done
#!/bin/bash
# 09_affiche_arguments_spéciaux.sh
echo "Nom du script $0"
echo "Sremier paramètre $1"
echo "Second paramètre $2"
echo "Tous les paramètres $*"
echo "Tous les paramètres (préservant des espaces) $@"
echo "Nombre de paramètres $#"
echo "PID du shell $$"
echo "code de retour $?"
exit
declare -i variable
https://linux.goffinet.org/administration/scripts-shell/ 17/35
05/01/2021 Scripts Shell - Linux Administration
4.10. Tableaux
Exemple de création de tableau var :
for i in "${!var[@]}"; do
printf "%s\t%s\n" "$i" "${var[$i]}"
done
https://linux.goffinet.org/administration/scripts-shell/ 18/35
05/01/2021 Scripts Shell - Linux Administration
5. Script rm amélioré
Cette section est une reprise de l’exercice de script rm_secure.sh de Christophe Blaess.
5.1. Commande rm
https://linux.goffinet.org/administration/scripts-shell/ 19/35
05/01/2021 Scripts Shell - Linux Administration
rm --help
Usage: rm [OPTION]... FILE...
Remove (unlink) the FILE(s).
By default, rm does not remove directories. Use the --recursive (-r or -R)
option to remove each listed directory, too, along with all of its contents.
To remove a file whose name starts with a '-', for example '-foo',
use one of these commands:
rm -- -foo
rm ./-foo
5.2. Description
Il s’agit d’une fonction à “sourcer” qui ajoute des fonctionnalités à la commande /bin/rm :
une sorte de corbeille temporaire
Les fichiers/dossiers effacés sont placés dans une corbeille temporaire avant suppression.
https://linux.goffinet.org/administration/scripts-shell/ 20/35
05/01/2021 Scripts Shell - Linux Administration
5.3. Concepts
Le script met en oeuvre les notions suivantes :
définition de variables
imbrications de boucles
boucle while; do command; done
boucle case/esac ) ;;
condition if/then
tests [ ]
5.4. Structure
Le Script exécute un traitement séquentiel :
source rm_secure.sh
~/.bashrc
~/.bash_profile
https://linux.goffinet.org/administration/scripts-shell/ 21/35
05/01/2021 Scripts Shell - Linux Administration
if condition ; then
commande
fi
Conditions et tests
La condition peut-être n’importe quelle commande,
souvent la commande test représentée aussi par [ ] .
Structure case-esac
case expression in
motif_1 ) commande_1 ;;
motif_2 ) commande_2 ;;
esac
L’expression indiquée à la suite du case est évaluée et son résultat est comparé aux différents
motifs. En cas de correspondance avec le motif, une commande suivante est réalisée. Elle se
termine par ;;
https://linux.goffinet.org/administration/scripts-shell/ 22/35
05/01/2021 Scripts Shell - Linux Administration
case
*) ;;
?) ;;
O* | o* | Y* | y*) ;;
3.*) ;;
esac
Exercices
1. Écrivez un script qui vérifie l’existence d’au moins un paramètre dans la commande.
2. Écrivez un script qui vérifie que deux paramètres sont compris endéans un intervalle
compris entre 0 et 100.
3. Écrivez un script qui demande O/o/Oui/oui et N/n/Non/non dans toutes ses formes et qui
rend la valeur.
4. Écrivez un script qui ajoute un utilisateur existant dans un groupe.
5. Écrivez un script qui crée un rapport sommaire sur les connexions erronées sur votre
machine.
6. Écrivez un script qui utilise les options de la commande test (ou [ ] ) pour décrire les
fichiers qui lui sont passés en argument.
https://linux.goffinet.org/administration/scripts-shell/ 23/35
05/01/2021 Scripts Shell - Linux Administration
I="ubuntu1604.qcow2"
echo ${I#*.}
qcow2
I="ubuntu1604.qcow2"
echo ${I%.qcow2}
ubuntu1604
I="ubuntu1604.qcow2"
echo ${I%.qcow2}
ubuntu1604
I="ubuntu1604.qcow2"
echo ${I:11}
qcow2
I="ubuntu1604.qcow2"
echo ${I/qcow2/img}
ubuntu1604.img
echo ${I/u/\-}
-buntu1604.qcow2
echo ${I//u/\-}
-b-nt-1604.qcow2
https://linux.goffinet.org/administration/scripts-shell/ 24/35
05/01/2021 Scripts Shell - Linux Administration
are_you_sure () {
read -r -p "Are you sure? [y/N] " response
case "$response" in
[yY][eE][sS]|[yY])
sleep 1
;;
*)
exit
;;
esac
}
2. Fonction check_distribution
check_distribution () {
if [ -f /etc/debian_version ]; then
echo "Debian/Ubuntu OS Type"
elif [ -f /etc/redhat-release ]; then
echo "RHEL/Centos OS Type"
fi
}
3. Fonctions check_variable
variable=""
check_variable () {
case ${type} in
isolated) echo "isolated" ;;
nat) echo "nat" ;;
full) echo "full" ;;
*) echo "isolated, nat or full ? exit" ; exit 1 ;;
esac
}
4. Fonction check_parameters
parameters=$#
check_parameters () {
# Check the number of parameters given and display help
if [ "$parameters" -ne 2 ] ; then
echo "Description : This script do this"
echo "Usage : $0 <type : isolated or nat or full>"
echo "Example : '$0 isolated' or '$0 nat'"
exit
fi
}
https://linux.goffinet.org/administration/scripts-shell/ 25/35
05/01/2021 Scripts Shell - Linux Administration
5. Fonction check_root_id
check_root_id () {
if [ "$EUID" -ne 0 ]
then echo "Please run as root"
exit
fi
}
[ `grep -c "vmx" /proc/cpuinfo` == 0 ] && { echo "Please enable virtualization instructions" ; exit
1 ; }
8. Fonction check_interface
check_interface () {
if grep -qvw "$interface" <<< $(ls /sys/class/net) ; then
echo "This interface ${interface} is not available"
echo "Please create a valid bridge or choose between : "
echo $(ls /sys/class/net)
exit
fi
}
https://linux.goffinet.org/administration/scripts-shell/ 26/35
05/01/2021 Scripts Shell - Linux Administration
2.Fonction create_mac_address
create_mac_address () {
mac=$(tr -dc a-f0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/')
echo $mac
}
https://linux.goffinet.org/administration/scripts-shell/ 27/35
05/01/2021 Scripts Shell - Linux Administration
alea () {
apt-get -y install uuid-runtime openssl
alea1=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo;)
echo "1. urandom alea : $alea1"
alea2=$(date +%s | sha256sum | base64 | head -c 32 ; echo)
echo "2. date alea $alea2"
alea3=$(openssl rand -base64 32)
echo "3. openssl alea : $alea3"
alea4=$(uuidgen -t)
echo "4. time based uuid : $alea4"
alea5=$(uuidgen -r)
echo "5. random based uuid : $alea5"
echo "6. random based uuid résumé : ${alea5:25}"
echo "7. random based uuid résumé : ${alea5//\-/}"
}
https://linux.goffinet.org/administration/scripts-shell/ 28/35
05/01/2021 Scripts Shell - Linux Administration
#!/bin/bash
##########################################################################
# Copyright: Leon Teale @leonteale https://leonteale.co.uk
##########################################################################
##########################################################################
# Program: <APPLICATION DESCRIPTION HERE>
##########################################################################
VERSION="0.0.1"; # <release>.<major change>.<minor change>
PROGNAME="<APPLICATION NAME>";
AUTHOR="You, you lucky so and so";
##########################################################################
## Pipeline:
## TODO:
##########################################################################
##########################################################################
# XXX: Coloured variables
##########################################################################
red=`echo -e "\033[31m"`
lcyan=`echo -e "\033[36m"`
yellow=`echo -e "\033[33m"`
green=`echo -e "\033[32m"`
blue=`echo -e "\033[34m"`
purple=`echo -e "\033[35m"`
normal=`echo -e "\033[m"`
##########################################################################
# XXX: Configuration
##########################################################################
declare -A EXIT_CODES
EXIT_CODES['unknown']=-1
EXIT_CODES['ok']=0
EXIT_CODES['generic']=1
EXIT_CODES['limit']=3
EXIT_CODES['missing']=5
EXIT_CODES['failure']=10
DEBUG=0
param=""
##########################################################################
# XXX: Help Functions
##########################################################################
show_usage() {
echo -e """Web Application scanner using an array of different pre-made tools\n
Usage: $0 <target>
https://linux.goffinet.org/administration/scripts-shell/ 29/35
05/01/2021 Scripts Shell - Linux Administration
exit 1
exit ${EXIT_CODES['ok']};
}
show_version() {
echo "$PROGNAME version: $VERSION ($AUTHOR)";
exit ${EXIT_CODES['ok']};
}
debug() {
# Only print when in DEBUG mode
if [[ $DEBUG == 1 ]]; then
echo $1;
fi
}
err() {
echo "$@" 1>&2;
exit ${EXIT_CODES['generic']};
}
##########################################################################
# XXX: Initialisation and menu
##########################################################################
if [ $# == 0 ] ; then
show_usage;
fi
# Make sure we have all the parameters we need (if you need to force any parameters)
#if [[ -z "$param" ]]; then
# err "This is a required parameter";
#fi
##########################################################################
https://linux.goffinet.org/administration/scripts-shell/ 30/35
05/01/2021 Scripts Shell - Linux Administration
main() {
header
main "$@"
debug $param;
https://mywiki.wooledge.org/BashGuide (https://mywiki.wooledge.org/BashGuide)
Pour réaliser cet exercice nous avons besoin d’un certain nombre de fichiers. Une idée serait
d’utiliser la commande touch . Supposons qu’il faille créer 100 fichiers numérotés dans un dossier
temporaire.
Pour vider et créer un dossier temporaire de travail, on pourrait proposer ceci d’illustrer la
fonction conditionnelle if condition ; then commandes; else commandes; fi :
#! /bin/sh
# 01_tmp.sh
dir="${HOME}/tmp/"
if [ -d ${dir} ] ; then
rm -rf ${dir}
echo "Le dossier de travail ${dir} existe et il est effacé"
fi
mkdir ${dir}
echo "Le dossier de travail ${dir} est créé"
NAME
touch -- change file access and modification times
SYNOPSIS
touch [-A [-][[hh]mm]SS] [-acfhm] [-r file] [-t [[CC]YY]MMDDhhmm[.SS]] file ...
DESCRIPTION
The touch utility sets the modification and access times of files. If any file does not
exist, it is created with default permissions.
By default, touch changes both modification and access times. The -a and -m flags may be used
to select the access time or the modification time individually. Selecting both is equivalent
to the default. By default, the timestamps are set to the current time. The -t flag explic-
itly specifies a different time, and the -r flag specifies to set the times those of the spec-
ified file. The -A flag adjusts the values by a specified amount.
Pour faire une certaine chose tant qu’une condition est remplie on utilise une boucle while
https://linux.goffinet.org/administration/scripts-shell/ 32/35
05/01/2021 Scripts Shell - Linux Administration
#! /bin/sh
# 02_creation_fichiers0.sh
dir="${HOME}/tmp/"
i=0
while [ $i -lt 100 ] ; do
touch ${dir}fic$i.tar.gz
echo "Création de ${dir}fic$i.tar.gz"
i=$[$i+1]
done
commandes; done :
#!/bin/sh
# 03_creation_fichiers.sh
dir="${HOME}/tmp/"
i=0
#for ((initial;condition;action))
for ((i=0;i<100;i=i+1)); do
touch ${dir}fic$i.tar.gz
echo "Création de ${dir}fic$i.tar.gz"
done
Cas : renommage
Cas : renommage de *.tar.gz en *.tar.gz.old
Supposons maintenant que nous souhaitions renommer tous nos fichiers *.tar.gz en *.tar.gz.old,
nous taperons le script suivant :
#!/bin/sh
# 04_renommage.sh
#x prend chacune des valeurs possibles correspondant au motif : *.tar.gz
dir="${HOME}/tmp/"
for x in ${dir}*.tar.gz ; do
# tous les fichiers $x sont renommés $x.old
echo "$x -> $x.old"
mv "$x" "$x.old"
# on finit notre boucle
done
https://linux.goffinet.org/administration/scripts-shell/ 33/35
05/01/2021 Scripts Shell - Linux Administration
Voici le script inverse, c’est sans compter sur d’autres outils pour d’autres situations :
#!/bin/sh
# 05_denommage.sh
#x prend chacune des valeurs possibles correspondant au motif : *.tar.gz.old
dir="${HOME}/tmp/"
for x in ${dir}*.tar.gz.old ; do
# tous les fichiers $x sont renommés $x sans le .old
echo "$x -> ${x%.old}"
mv $x ${x%.old}
# on finit notre boucle
done
Tags : bash
LAISSER UN COMMENTAIRE
https://linux.goffinet.org/administration/scripts-shell/ 34/35
05/01/2021 Scripts Shell - Linux Administration
https://linux.goffinet.org/administration/scripts-shell/ 35/35