shell FAQ

Creation: 15 fevrier 2006
Mise à jour: 8 septembre 2011
Version: 1.2
Author: Jean-Louis Bicquelet-Salaün
Location: http://jlbicquelet.free.fr
Copyright: (c) 2006-2011 Jean-Louis BICQUELET-SALA�N

shell Frequently-Asked Questions

Le shell d'unix et de linux peut être plein de surprise. La présente FAQ correspond aux versions courrantes bourn shell, korn shell etbash.

Pour plus d'information au sujet de cette faq, contactez Jean-Louis BICQUELET


FAQ Revised: dimanche 08 septembre 2013 22:18:46


Table of Contents

1. shell
2. string
3. date
4. repertoires
5. fichiers
6. commandes utiles
7. calcul

1. shell

1.1. Comment parser la ligne de commande ?
Il existe plusieures manièegrave;res de faire. La façon la plus simple est celle-ci:
    #!/bin/sh

    HELP_=false
    MAN_=false

    while getopts hm o
    do case $o in
      h) HELP_=true;;
      m) MAN_=true;;
      [?])  print >&2 "Usage: $0 [-s] [-d seplist] file ..."
                    exit 1;;
      esac
    done

    echo $HELP_
    echo $MAN_

    shift $OPTIND-1
    echo $#


1.2. Une simple boucle for
    #!/bin/bash

    var=0
    LIMITE=10

    while [ "$var" -lt "$LIMITE" ]
    do
      echo "$var "
      var=`expr $var + 1`
    done


1.3. Véeacute;rification d'une entréeacute;e oui/non
    if [ -f $outfile ]
    then
        echo "Output file [$outfile] already exists"
        echo "Okay to overwrite? ( y/n ) : \c"
        read answer
        if [ "$answer" = "n" ] || [ "$answer" = "N" ]
        then
    	echo "Aborting"
    	exit
        fi
    fi


1.4. Comment réeacute;cupéeacute;rer le réeacute;sultat d'un calcul dans une variable ?
    a=`bc << quit
    24544 / 1024
    quit
    `


1.5. comment afficher une trace d'éeacute;tape datéeacute;e ?
    printf "%-7s - %02d - %-10s - %-10s\n" 'STEP01'  '01' `date +%d/%m/%Y` `date +%HH%MM%SS`



2. string

2.1. comment chercher une chaine ddans une sous chaine?
La commande expr dispose d'un certain nombre d'outils dont celui-ci:
chaineZ=abcABC123ABCabc

echo `expr index "$chaineZ" C12` 



3. date

3.1. Comment générer un nom avec une date?
Pour obtenir un format year/month/day:
    (d=`date +%y%m%d`;echo "machine_$d.nmon")
i
Pour un format year/nb of day since the beginning of the year
    (d=`date +%Y%j`;n=`uname` -u;echo "`$n_$d.nmon")


3.2. Comment écrire l'heure ?
    printf "%s;" "$(date "+%Y/%m/%d %H:%M:%S")"


3.3. comment obtenir un timestamp en fonction d'une date et d'une heure?
a=`perl -e "use Time::Local;print timelocal(0,10,9,13,8,2006);"`


3.4. comment obtenir date et une heure à partir d'un timestamp ?
En supposant la variable $a correctement remplie :
perl -e "use Time::Local;print scalar localtime($a);"

                  ,,__
        ..  ..   / o._)                   .---.
       /--'/--\  \-'||        .----.    .'     '.
      /        \_/ / |      .'      '..'         '-.
    .'\  \__\  __.'.'     .'          ._
      )\ |  )\ |      _.'
     // \\ // \\
    ||_  \\|_  \\_
    '--' '--'' '--'


3.5. comment obtenir le calendier d'un mois donné ?
    #cal 6 2007
             June 2007
    Sun Mon Tue Wed Thu Fri Sat
                         1   2      22
     3   4   5   6   7   8   9      23
    10  11  12  13  14  15  16      24
    17  18  19  20  21  22  23      25
    24  25  26  27  28  29  30      26

  • cal retourne le mois courrant
  • cal 2002 retourne le calendrier pour 2002


3.6. comment afficher le calendrier en commencant par le lundi ?
cal | awk 'NR=1 { print $0} NR>1 {print $2"\t"$3"\t"$4\t"$5\t"$6\t"$7\t"$1}'


4. repertoires

4.1. comment lister uniquement les réeacute;pertoires?
ls -d */


4.2. Comment obtenir un listing des réeacute;pertoires réeacute;cursif?
Une des solutions suivantes doit correspondre àaacute; vos besoins:
  • ls -R (toutes les versions de "ls" n'ont pas l'option -R)
  • find . -print (doit fonctionner partout)
  • du -a . (affiche et le nom et le taille)
Si vous recherchez un pattern qui recherche tous les fichiers .c dans le réeacute;pertoire et les sous réeacute;pertoires vous pouvez utiliser:
% some-command `find . -name '*.c' -print`



5. fichiers

5.1. Comment véeacute;rifier qu'un fichier existe ?
    if [ ! -f $FILE ]; then
        echo "File \"$FILE\" does not exist."
        exit $E_BADARGS
    fi


5.2. Comment renommer les fichiers "*.foo" en "*.bar", ou changer le nom des fichiers en minuscules ?
for f in *.foo; do
     base=`basename $f .foo`
     mv $f $base.bar
done


5.3. Comment extraire tous les fichiers d'un réeacute;pertoire ?
    ls -R | sed -e 's/://'


5.4. Comment lire un fichier ligne àaacute; ligne?

Utilisez exec avec une redirection vers un file descriptor (de 3 a 99), combinéeacute; avec read -unumber var.

5.5. comment accéeacute;der àaacute; un réeacute;pertoire commencant par -?
cd ./-1701931229


5.6. comment effacer les fichiers en demande confirmation àaacute; chaque fois?
rm -i list*
rm: Remove list_cat? n
rm: Remove list_? y
rm: Remove list_quest? n



6. commandes utiles

6.1. comment afficher un fichier de texte ou un script?
cat fichier


6.2. comment afficher un fichier de texte en supprimant les lignes blanches en double?
cat -s fichier


6.3. comment afficher un fichier avec un nombre de ligne?
#cat -b script
     1  #!/usr/bin/ksh -x
     2  #
     3  # Script 
     4  #
     5  ## variables #################################################################

     6  # Global Variables
     7  log="/tmp/log"



7. calcul

7.1. comment faire un calcul complexe en shell ?
a=56
perl -e "print `sin($a) * 3;"
-1.56465300626074            c
ou encore
b=`perl -e "print `sin($a) * 3;"`



Copyright (c) 2004-2013 Jean-Louis BICQUELET

This list of questions and answers was generated by makefaq.