Shell script tips

Un article de SeRoM - Wiki.

Sommaire

[modifier] READ

  • read sert à  initialiser des variable shell:
 $ read brol bidulle
 ceci est du bazard
 $ echo $brol
 ceci
 $ echo $bidulle
 est du bazard

[modifier] Test

[modifier] Numerique

  • 'test <num1> <eval-flag> <num2>'

note: <num> est soit un nombre, soit un -l <string> qui équivaut à  la longeur du string

[modifier] tab of eval-flag

  • -eq : equal (=)
  • -ne : not equal (!=)
  • -lt : less than (<)
  • -le : less or equal (<=)
  • -gt : greater than (>)
  • -ge : greater or equal (>=)

[modifier] Sting

  • test -z <$var> : test si la variable n'a pas encore été initialisée(true), ou si la longueur du string = zéro
  • test <$var> <eval> <$var> : compare les chaines

[modifier] tab of eval

  • = : Vrai si les deux chaines sont identiques
  • != : Vrai si les deux chaines ne sont pas identiques
  • > : Vrai si la 1ere chaine est plus longue que la 2nd
  • < : Vrai si la 2nd chaine est plus longue que la 1ere

[modifier] Fichier

  • test <eval-flag> <File>

[modifier] tab of eval-flag

  • -G : Existe et appartient au même groupe que l'exécutant
  • -L : Existe et est un SoftLink
  • -O : Existe et appartient au même utilisateur que l'exécutant
  • -S : Existe et est un Socket
  • -b : Existe et est un fichier d'un Bloc Device
  • -c : Existe et est un fichier d'un char Device
  • -d : Est un Dossier
  • -e : Existe
  • -f : Existe et est un fichier regular
  • -g : ...
  • -r : Existe et possède les droits de lecture
  • -s : Existe et n'est pas un fichier vide
  • -u : ...
  • -w : Existe et possède les droits d'écriture
  • -w : Existe et possède les droits exécution
  • -ot : Fichier plus vieux (>< nt)

[modifier] Combinaison logique

  • -a/-o &&/|| : Pour combiner deux conditions avec les opérateurs logiques AND ou OR
  • ! : Pour la négation

[modifier] Boucles et conditions en Shell

[modifier] IF

 if
 	[ -e file]
 then
 	command-block
 else
 	command-blok
 fi
 if
 	[ test ]
 then
 	command-block
 elif
 	[ test ]
 then
 	command-block
 else
 	command-blok
 fi

[modifier] CASE

 case <string> in
 pattern)
 	command-block ;;
 pattern)
 	command-block ;;
 *)
 	command-block-by-default ;;
 esac

[modifier] FOR

 for  in <list>
 do
 	command-block
 done

[modifier] WHILE

 while
 	[ test ]
 do
 	command-block
 done

[modifier] Fonction

[modifier] Déclaration

 name () { commands;}

[modifier] Appel

 name param1 param2 ...

[modifier] Variable

Par défaut, elles sont déclaré de facon global sauf indication contraire:

 UneFonction()
 {
 	#déclaration de la variable locale
 	local var=1
 }
 #Ici $var n'est plus reconnu

[modifier] Tableaux

[modifier] Initialisations

Plusieurs possibilités:

 tab[0]=Brol
 tab[1]=Bidule
 tab[2]=Truc
 tab[3]=Chose
 tab=([0]=Brol [1]=Bidule [2]=Truc [3]=Chose)
 tab=(Brol Bidule Truc Chose)

[modifier] Attributs spéciaux

* ${nom_tableau[0]} : Donne le premier élément du tableau
* ${nom_tableau[@]} : Donne fait référence à tout les éléments du tableau (utile pour une boucle for. ( for i in "${nom_tableau[@]}" do [...] done )
* ${#nom_tableau[@]} : Donne la longueur du tableau

[modifier] boucler dans un tableau

 tab=(Brol Bidule Truc Chose)
 
 for elem in ${tab[@]}
 do
     echo $elem
 done

[modifier] Include

 #!/bin/sh
 . /path/to/MonFichierLib

[modifier] Couleur

Un peu de couleur dans cette console de brute!

Cela fonctionne avec des balises:

  • \033<id-couleur>m : Balise pour commençant un couleur
  • [<?>;<??>m: ID Couleur
  • \033[m : balise de fermeture (reset le couleur initiale)

Ce qui nous donne:

  echo -e " Texte normal \033[0;32mTexte en vert\033[m Texte normal"

Un definition de variable peut donc etre pratique:

  # Definition des couleurs:
  ColorStart="\033"
  ColorStop="\033[m"
  ColorRed="[0;31m"
  ColorLightRed="[1;31m"
  ColorGreen="[0;32m"
  ColorLightGreen="[1;32m"
  ColorYellow="[0;33m"
  ColorLightYellow="[1;33m"
  ColorBlue="[0;34m"
  ColorLightBlue="[1;34m"
  ColorPink="[0;35m"
  ColorLightPink="[1;35m"
  ColorCyan="[0;36m"
  ColorLightCyan="[1;36m"
  ColorGray="[0;37m"
  ColorWhite="[1;37m"
  
  # Exemple d'utilisation
  echo -e "{ColorStart}${ColorRed}Texte en Rouge{ColorStop}"

Ou ce que j'ai l'habitude d'utiliser pour mes scripts pour mettre en évidence un status (OK | Error):

  # Definition des couleurs:
  START_COLOR_OK="\033[0;32m"
  START_COLOR_ERROR="\033[0;31m"
  STOP_COLOR="\033[m"
  OUT_OK="${START_COLOR_OK}Ok!${STOP_COLOR}"
  OUT_ERROR="${START_COLOR_ERROR}Error: ${STOP_COLOR}"
  
  # Exemple d'utilisation
  commande
  RET_CODE=$?
  case $RET_CODE in
          0)
                  echo -e "\t\t${OUT_OK}" ;;
          1)
                  echo -e "\t\t${OUT_ERROR}Message d'erreur";;
          *)
                  echo -e "\t\t${OUT_ERROR}Unknown Error!";;
  esac