Bouts de scripts

Voici quelques bouts de scripts bash qui pourraient être utiles.

Le premier montre comment tester la présence d'une valeur et envoie un message si elle est absente. Le tout en une ligne. Ensuite il réalise des calculs.

#!/bin/bash

A=${1:?"Erreur : vous devez indiquer la valeur de A"}
B=${2:?"Erreur : vous devez indiquer la valeur de B"}
C=${3:?"Erreur : vous devez indiquer la valeur de C"}

D1=$(echo 4 \* $A \* $C|bc)
D2=$(echo $B \* $B|bc)
D3=$(echo $D2 - $D1|bc);
echo $D3

 

Le second teste classiquement la présence d'un paramètre puis utlise des "if" imbriqués et des tests d'égalité :

#!/bin/bash

if [ $# -ne 3 ]
then
  exit 1
fi

S=1
if ([ "$1" != "$2" ] && [ "$2" != "$3" ] && [ "$1" != "$3" ])
then
  if [ "$2" \< "$3" ] && [ "$1" \< "$2" ]
  then
     #echo "cas no 1"
     exit 0
  fi
fi

if ([ "$1" == "$2" ] || [ "$2" == "$3" ] || [ "$1" == "$3" ]) ||
      ( [ "$1" \> "$2" ] || [ "$2" \> "$3" ] )
then
  #echo "cas no 2"
  exit 1
fi

Le suivant teste le nombre de paramètres transmis puis travaille sur les fichiers :

#!/bin/bash

if [ $# -eq 0 ]
then
  exit 1
fi

fic=$1

if [ -f $fic -a  ! -w $fic ]
then
  echo "Ok"
  exit 0
else
  echo "Ko"
  exit 1
fi

A noter que vous pouvez suivre l'exécution de vos scripts en ajoutant la ligne :

set -x

en début de script. Placez en fin de script la ligne suivante afin d'annuler cette option :

set +x

Le suivant teste la présence de caractère dans la chaine passée en argument :

#!/bin/sh

if ([ $# -eq 0 ])
then
  exit 1
fi

arg=$1


if [ $(echo $arg| grep X ) ] 
then
  if [ $(echo $arg| grep Y ) ]
  then
    exit 0
  else
    echo "Un X mais pas un Y"
    exit 1
  fi
else
  echo "Un X";
  exit 1
fi

Lancez le script avec la ligne :

./script.sh LINUX

./script LYNUX

Le suivant réalise des tests avec "case" :

#!/bin/sh

case $# in
  0)
    echo "Vous n'avez pas donné votre réponse"
    exit 3
    ;;
  1) ;;
  *)
    echo "Donnez une seule réponse"
    exit 4
    ;;
esac

case $1 in
  'o'|'O')
     echo "oui"
     exit 0
     ;;
  'n'|'N')
     echo "non"
     exit 1
     ;;
  *)
     echo "Pas compris" ;
     exit 5
     ;;
esac

Cela permet de tester le nombre de paramètres transmis et la réponse ainsi fournie.

Le suivant est un peu plus balaise :

#!/bin/sh
programme=vinagre
DIALOG=${DIALOG=dialog}
# Affiche toutes les commandes au fur et à mesure de leur exécution
set -x
tempfile=/var/tmp/base.$$$
trap "rm -f $tempfile" 1 2 5 15


    dblist=""
    N=0
    for DB in  $(awk -F: '!/^#/{print $2}' pcmaison.csv)
    do
      ((N = ${N} + 1))
      PG=$(awk -F: -v DB=$DB '$2==DB{print $1}' pcmaison.csv)
      dblist="$dblist $DB ($PG) "
    done
    # echo $dblist
    dialog --menu "Choisissez le PC sur lequel se connecter:" 10 60 10 $dblist 2>$tempfile
    rval="$?"
    DB=$(awk -F: '{print $1}' $tempfile)
    # echo $DB
    if [ ! ${#DB} -eq 0 ]
    then
      clear
      $programme $DB   
    else
      echo "Abandon"
    fi

avec le fichier "pcmaison.csv" qui contient :

Romain:192.168.0.32
Thomas:192.168.0.21
Marie:192.168.0.12
Papa:192.168.0.26

Et cela affiche :

Pour que cela fonctionne il faut au préalable installer "dialog" via la commande :

$ sudo apt install dialog

Pour obtenir le même type de traitement vous pouvez utliser "zenity" qui est plus simple à mon avis :

#!/bin/sh

programme=vinagre

rep=$(zenity --list \
  --title="Choisissez la station cible" --print-column=2 \
  --width=200 --height=170 \
  --column="Nom" --column="IP" \
Romain 192.168.0.32 \
Thomas 192.168.0.21 \
Marie 192.168.0.12 \
Papa 192.168.0.26 );

echo ${rep}

#Si on clique sur le bouton Annuler
titre=${rep}

if [ "$titre" = "" ]
then
    #On quitte le script
    echo "On quitte"
    exit
fi

clear
$programme -f $DB ${titre}

Ce qui est important est " --print-column=2" qui permettra de déterminer ce qu"à choisi l'utlisateur.

Le suivant permet de renommer un fichier :

#!/bin/bash

fic=${1:?"Erreur : vous devez indiquer le nom du fichier a renommer"}

N=$(echo $fic|cut -d. -f1)
E1=$(echo $fic|cut -d. -f2)
E2=$(echo $fic|cut -d. -f3)

if [ -z ${E2} ]
then
 mv ${fic} ${N}_alice.${E1}
else
 mv ${fic} ${N}_alice.${E1}.${E2}
fi

Ce script utlise la commande "cut" pour découper le nom du fichier transmis en paramètre. Il tente de découper le nom du fichier en trois parties afin de pouvoir traiter des fichiers nommés par exemple "foo.tar.gz".  Le fichier est alors renommé en ajoutant le suffix "_alice" en tenant compte du nombre d'extensions du fichier (2 ou 3).

Le nom du fichier a été décomposé via la commande "cut" en précisant que le nom du fichier sera découpé en fonction de la présenced de point. A chaque fois on ne retient qu'une partie du nom : -f1 pour la première, etc...

Les suivant teste le caractère passé sous forme de paramètre aprés avoir réalisé quelques tests. Il utlise la structure du "case" ainsi que des expressions rationnelles :

#!/bin/sh

if [ $# != 1 ]
then
    echo "Donner exactement un argument"
    exit 90
fi

lg=${#1}

if [ $lg -gt 1 ]
then
  echo "Donnez un seul caractère"
  exit 91
fi

case $1 in
  [a-z])
    echo  "Minuscule"
    exit 10
    ;;
  [A-Z])
    echo "Majuscule"
    exit 11
    ;;
  [0-9])
    echo "Chiffre"
    exit 12
    ;;
  *)
    echo "Autre"
    exit 20
    ;;
esac

Le suivant est tout simple il montre comment manipuler les noms de fichiers en bash :

$ for i in *sh; do echo ${i%.sh} ;done

la commande "${ % } permet de supprimer la fin du nom du fichier.

Le suivant réalise une lecture au clavier aprés avoir affiché le contenu d'un tableau de mois :

#!/bin/bash

mois=('Janvier'  'Février'  'Mars'  'Avril' 'Mai' 'Juin'  'Juillet'  'Aout'  'Septembre'  'Octobre'  'Novembre'  'Decembre');
echo ${mois[*]}
read -p "Choisissez un mois " une_reponse
echo $une_reponse

case $une_reponse in
      '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'10'|'11'|'12')
          echo "On continue"
          ;;
      *)
          echo "Reponse incorrecte"
          ;;
esac

Le suivant permet de compter les arguments passés au script :

#!/bin/bash
i=0
for arg in $*
do
  i=$((i+1))
  printf "L'argument no %2s est : %-15s\n" $i $arg
done

Fait le 03/07/2018