Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Vos scripts shell


Sujet :

Shell et commandes GNU

  1. #61
    Futur Membre du Club
    Salut,

    Citation Envoyé par N_BaH Voir le message
    késako if ${var+"true"} ?
    Cela me dit que la variable $PID_hor a une valeur (elle n'est définie - et donc n'a une valeur - que si le script horloge.sh est présent sur le répertoire).

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # if ${var+"false"}; then  echo "var non definie"; else echo "var definie"; fi
    var non definie
    # var="y"
    # if ${var+"false"}; then  echo "var non definie"; else echo "var definie"; fi
    var definie
    # unset var
    # if ${var+"false"}; then  echo "var non definie"; else echo "var definie"; fi
    var non definie


    Pierre.

  2. #62
    Expert éminent sénior
    J'utilise ça:
    Code bash :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function _is_set()
    {
        # [[ -v $1 ]] with bash 4.2+
        [[ -n ${!1+x} ]]
    }



    =>
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $> _is_set toto && echo "set" || echo "unset"
    unset
     
    $> toto=42 _is_set toto && echo "set" || echo "unset"
    set
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #63
    Modérateur

    Cela me dit que la variable $PID_hor a une valeur
    c'est très bizarre que ça fonctionne, puisque la syntaxe est
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    if COMMANDES; then COMMANDES; [ elif COMMANDES; then COMMANDES; ]... [ else COMMANDES; ] fi
    or, le développement d'une variable ne constitue pas une commande.

    c'est un comportement étrange du shell qui considère qu'il y aura forcément une commande après if :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var=azerty
    if $var; then echo ok; else echo ko; fi
    bash: azerty : commande introuvable
    ko


    la manière traditionnelle (et donc la plus lisible) est :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    if test -n "$var" #avec des guillemets, sinon test pourrait ne tester que la chaîne -n, qui existe toujours !
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  4. #64
    Expert éminent sénior
    Bonjour,

    Par contre, cela ne peut fonctionner qu'avec false, car avec true:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ unset XX
    $ if ${XX+"true"} ;  then echo ko ; else echo ok ; fi
    ko
    $ XX=0
    $ if ${XX+"true"} ;  then echo ko ; else echo ok ; fi
    ko
    $ XX=1
    $ if ${XX+"true"} ;  then echo ko ; else echo ok ; fi
    ko

    Ce qui est normal, puisque soit la variable est défini, soit on ramène true (donc dans tous les cas on a vrai
    Et la bonne syntaxe est ${XX:+"false"}
    Cordialement.

  5. #65
    Expert éminent sénior
    Avec le ':' en plus, ce qui est testé c'est si la variable est non vide, pas si elle est définie. Et effectivement, on dirait qu'il y a des effets de bords bizarres qui font que ça marche.

    Bref, si votre bash est assez récent, -v, c'est bien! C'est fait pour.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #66
    Expert confirmé
    Nom du script: test-variable-substitution.sh

    Compatible avec: sh, ksh, bash

    Descriptif: permet de se rappeler comment fonctionne la substitution de variable avec les options '-' ':-' '+' ':+'

    Pré-requis: aucun

    Code:
    Code shell :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    #!/bin/sh
    
    _JD_TVS_timeStamp="Time-stamp: <2017/08/05 12:00:00 jack (sokobania)>"
    _JD_TVS_timeStamp=$(expr "${_JD_TVS_timeStamp}" : '.*\(<.*>\).*')
    
    #================================================================
    # Name  : test-variable-substitution.sh
    # Author: Jack (sokobania)
    # Desc  : Script to help remmeber shell variable substitution and common tests
    # ------
    #
    # Usage : test-variable-substitution.sh
    # -----
    #
    # Compatible with: sh, ksh, bash
    # ---------------
    #
    # Requirements: none
    # ------------
    #
    #================================================================
    
    # Raise an error when attempting to read an unset variable
    set -u
    
    # Make sure 'UUU' is unset
    unset UUU
    
    # Create an empty var 'EEE'
    EEE=''
    
    # Create a set var 'SSS'
    SSS='X'
    
    cat <<EOF
    Note:
    A variable is said to be 'unset', when it has not yet been set or has been explicitely unset: unset V
    A variable is said to be 'empty', when it is set to the empty string: V='' or V=
    A variable is said to be 'set', when it is set to a non-empty string: V='X'
    EOF
    
    # Indirect test (by Luc Hermitte)
    # [[ -v $1 ]] with bash 4.2+
    function _is_set() { [[ -n ${!1+x} ]]; }
    
    # Title
    printf '\n+=======================+=========+=========+=========+'
    printf "\n| %-21s | %-7s | %-7s | %-7s |" 'Instruction' 'unset V' " V=''" " V='X'"
    printf '\n+-----------------------+---------+---------+---------+'
    printf "\n| %-21s | %-7s | %-7s | %-7s |" 'State of V' 'unset' ' empty' ' set'
    printf '\n+=======================+=========+=========+=========+'
    
    # ${V-D}
    
    t=$(echo '"${V-D}"')
    u=$(echo "${UUU-D}")
    e=$(echo "${EEE-D}")
    s=$(echo "${SSS-D}")
    
    printf "\n| %-21s | %7s | %7s | %7s |" "$t" "'$u'  " "'$e'  "  "'$s'  "
    printf '\n+-----------------------+---------+---------+---------+'
    
    # ${V:-D}
    
    t=$(echo '"${V:-D}"')
    u=$(echo "${UUU:-D}")
    e=$(echo "${EEE:-D}")
    s=$(echo "${SSS:-D}")
    
    printf "\n| %-21s | %7s | %7s | %7s |" "$t" "'$u'  " "'$e'  "  "'$s'  "
    printf '\n+-----------------------+---------+---------+---------+'
    
    # ${V+D}
    
    t=$(echo '"${V+D}"')
    u=$(echo "${UUU+D}")
    e=$(echo "${EEE+D}")
    s=$(echo "${SSS+D}")
    
    printf "\n| %-21s | %7s | %7s | %7s |" "$t" "'$u'  " "'$e'  "  "'$s'  "
    printf '\n+-----------------------+---------+---------+---------+'
    
    # ${V:+D}
    
    t=$(echo '"${V:+D}"')
    u=$(echo "${UUU:+D}")
    e=$(echo "${EEE:+D}")
    s=$(echo "${SSS:+D}")
    
    printf "\n| %-21s | %7s | %7s | %7s |" "$t" "'$u'  " "'$e'  "  "'$s'  "
    printf '\n+=======================+=========+=========+=========+'
    
    # unset : test -z ${V+D}
    
    t=$(echo 'test -z "${V+D}"')
    u=$(if test -z "${UUU+D}"; then echo 'true '; else echo 'F   '; fi)
    e=$(if test -z "${EEE+D}"; then echo 'true '; else echo 'F   '; fi)
    s=$(if test -z "${SSS+D}"; then echo 'true '; else echo 'F   '; fi)
    
    printf "\n| %-21s | %7s | %7s | %7s |" "$t" "$u" "$e"  "$s"
    printf ' unset'
    printf '\n+-----------------------+---------+---------+---------+'
    
    # empty : test -z "${V-D}"
    
    t=$(echo 'test -z "${V-D}"')
    u=$(if test -z "${UUU-D}"; then echo 'true '; else echo 'F   '; fi)
    e=$(if test -z "${EEE-D}"; then echo 'true '; else echo 'F   '; fi)
    s=$(if test -z "${SSS-D}"; then echo 'true '; else echo 'F   '; fi)
    
    printf "\n| %-21s | %7s | %7s | %7s |" "$t" "$u" "$e"  "$s"
    printf ' empty (set to empty)'
    printf '\n+-----------------------+---------+---------+---------+'
    
    # set : test -n ${V:+D}
    
    t=$(echo 'test -n "${V:+D}"')
    u=$(if test -n "${UUU:+D}"; then echo 'true '; else echo 'F   '; fi)
    e=$(if test -n "${EEE:+D}"; then echo 'true '; else echo 'F   '; fi)
    s=$(if test -n "${SSS:+D}"; then echo 'true '; else echo 'F   '; fi)
    
    printf "\n| %-21s | %7s | %7s | %7s |" "$t" "$u" "$e"  "$s"
    printf ' set (but not empty)'
    printf '\n+=======================+=========+=========+=========+'
    
    # not unset : test -n ${V+D}
    
    t=$(echo 'test -n "${V+D}"')
    u=$(if test -n "${UUU+D}"; then echo 'true '; else echo 'F   '; fi)
    e=$(if test -n "${EEE+D}"; then echo 'true '; else echo 'F   '; fi)
    s=$(if test -n "${SSS+D}"; then echo 'true '; else echo 'F   '; fi)
    
    printf "\n| %-21s | %7s | %7s | %7s |" "$t" "$u" "$e"  "$s"
    printf ' not unset (set or empty)'
    printf '\n+-----------------------+---------+---------+---------+'
    
    # not empty : test -n "${V-D}"
    
    t=$(echo 'test -n "${V-D}"')
    u=$(if test -n "${UUU-D}"; then echo 'true '; else echo 'F   '; fi)
    e=$(if test -n "${EEE-D}"; then echo 'true '; else echo 'F   '; fi)
    s=$(if test -n "${SSS-D}"; then echo 'true '; else echo 'F   '; fi)
    
    printf "\n| %-21s | %7s | %7s | %7s |" "$t" "$u" "$e"  "$s"
    printf ' not empty (unset or set)'
    printf '\n+-----------------------+---------+---------+---------+'
    
    # not set : test -z ${V:+D}
    
    t=$(echo 'test -z "${V:+D}"')
    u=$(if test -z "${UUU:+D}"; then echo 'true '; else echo 'F   '; fi)
    e=$(if test -z "${EEE:+D}"; then echo 'true '; else echo 'F   '; fi)
    s=$(if test -z "${SSS:+D}"; then echo 'true '; else echo 'F   '; fi)
    
    printf "\n| %-21s | %7s | %7s | %7s |" "$t" "$u" "$e"  "$s"
    printf ' not set (unset or empty)'
    printf '\n+=======================+=========+=========+=========+'
    
    # unset : test "${V-A}${V-B}" = "AB"
    
    t=$(echo '"${V-A}${V-B}" = "AB"')
    u=$(if test "${UUU-A}${UUU-B}" = "AB"; then echo 'true '; else echo 'F   '; fi)
    e=$(if test "${EEE-A}${EEE-B}" = "AB"; then echo 'true '; else echo 'F   '; fi)
    s=$(if test "${SSS-A}${SSS-B}" = "AB"; then echo 'true '; else echo 'F   '; fi)
    
    printf "\n| %-21s | %7s | %7s | %7s |" "$t" "$u" "$e"  "$s"
    printf ' unset'
    printf '\n+=======================+=========+=========+=========+'
    
    # set : _is_set 'V'
    
    t=$(echo "_is_set 'V'")
    u=$(if _is_set UUU; then echo 'true '; else echo 'F   '; fi)
    e=$(if _is_set EEE; then echo 'true '; else echo 'F   '; fi)
    s=$(if _is_set SSS; then echo 'true '; else echo 'F   '; fi)
    
    printf "\n| %-21s | %7s | %7s | %7s |" "$t" "$u" "$e"  "$s"
    printf ' set (or empty)'
    printf '\n+=======================+=========+=========+=========+'
    
    # Last line
    
    printf '\n'
    
    # Treat 1st case as special
    
    unset l
    for x in a "b c" d "" e
    do l=${l+${l}_}${x}
    done
    
    printf "\n%s => '%s'" 'unset l; for x in a "b c" d "" e; do l=${l+${l}_}${x}; done' "$l"
    
    unset l
    for x in "" a "b c" d "" e
    do l=${l+${l}_}${x}
    done
    
    printf "\n%s => '%s'" 'unset l; for x in "" a "b c" d "" e; do l=${l+${l}_}${x}; done' "$l"
    
    printf "\n\nok\n"
    
    exit 0


    Et le résultat:

    Note:
    Une variable est dite 'unset', quand on ne lui a pas encore affecté de valeur ou qu'elle a été explicitement désaffectée: unset V.
    Une variable est dite 'empty', quand on lui a affecté une chaîne vide: V= ou V=''.
    Une variable est dite 'set' quand on lui a affecté une valeur non-vide: V=X ou V='X'.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    +=======================+=========+=========+=========+
    | Instruction           | unset V |  V=''   |  V='X'  |
    +-----------------------+---------+---------+---------+
    | State of V            | unset   |  empty  |  set    |
    +=======================+=========+=========+=========+
    | "${V-D}"              |   'D'   |    ''   |   'X'   |
    +-----------------------+---------+---------+---------+
    | "${V:-D}"             |   'D'   |   'D'   |   'X'   |
    +-----------------------+---------+---------+---------+
    | "${V+D}"              |    ''   |   'D'   |   'D'   |
    +-----------------------+---------+---------+---------+
    | "${V:+D}"             |    ''   |    ''   |   'D'   |
    +=======================+=========+=========+=========+


    Et quelques tests:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    +=======================+=========+=========+=========+
    | Instruction           | unset V |  V=''   |  V='X'  |
    +-----------------------+---------+---------+---------+
    | State of V            | unset   |  empty  |  set    |
    +=======================+=========+=========+=========+
    | test -z "${V+D}"      |   true  |    F    |    F    | unset
    +-----------------------+---------+---------+---------+
    | test -z "${V-D}"      |    F    |   true  |    F    | empty (set to empty)
    +-----------------------+---------+---------+---------+
    | test -n "${V:+D}"     |    F    |    F    |   true  | set (but not empty)
    +=======================+=========+=========+=========+
    | test -n "${V+D}"      |    F    |   true  |   true  | not unset (set or empty)
    +-----------------------+---------+---------+---------+
    | test -n "${V-D}"      |   true  |    F    |   true  | not empty (unset or set)
    +-----------------------+---------+---------+---------+
    | test -z "${V:+D}"     |   true  |   true  |    F    | not set (unset or empty)
    +=======================+=========+=========+=========+
    | "${V-A}${V-B}" = "AB" |   true  |    F    |    F    | unset
    +=======================+=========+=========+=========+
    | _is_set 'V'           |    F    |   true  |   true  | set (or empty)
    +=======================+=========+=========+=========+


    Et un dernier petit rappel:

    Code shell :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    unset l
    for x in a "b c" d "" e;
    do l=${l+${l}_}${x};
    done
    => 'a_b c_d__e'
    
    unset l
    for x in "" a "b c" d "" e
    do l=${l+${l}_}${x}
    done
    => '_a_b c_d__e'


    Ce dernier n'est pas destiné à être utilisé tel quel (sinon on ferait mieux d'utiliser IFS et echo). C'est plus un "pattern" à utiliser pour gérer une liste avec un traitement particulier pour la première itération (il y a un intervalle de moins que de poteaux).

  7. ###raw>post.musername###
    Nouveau membre du Club
    Le fameux script pavé
    Bonjour bonjour,
    voici un script (c'était mon tout premier script) qui utilise rsync sur centos.

    NOM DU SCRIPT : backup_ganil.sh

    COMPATIBLE : avec bash

    Descriptif : permet le backup d'un serveur à un autre

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    #!/bin/sh
     
    volumes=$(cut -d' ' /etc/auto.netapp -f1)
     
            if ! mount | grep /dev/vd
            then    echo "WARNING !! DELL storage not mounted !"; exit
            fi
     
    declare -A VOLS
    running_rsync=`pgrep -a rsync | cut -d ' ' -f 7`
     
    for rrsync in $running_rsync
    do
           #VOLS[$rrsync]=1
    done
     
    for K in "${!VOLS[@]}"
    do
           echo $K
    done
            echo "${#VOLS[@]}"
     
    if [ "${#VOLS[@]}" -gt 1 ]; then
    echo "rsync is running, exit"; exit
    else echo "rsync is not running"
    fi
     
    #VARS
    test=$1
    if [ $# -eq 0 ] ; then
     
    for vol in $volumes
    do
     
    if [ ! -f "/root/backup_logs/$vol.log" ]; then
     
            ls /netapp/$vol > /dev/null 2>&1
     
            if [ $? -gt 0 ]; then
                    echo $vol non disponible
                    continue
            fi
     
            echo $vol
     
            # to do : évaluer la taille qu'il reste sur la partition
            # premier backup pour ce volume, questionner l'utilisateur sur la partition
            PS3="Sur quel serveur installer la sauvegarde ? "
            select rep in r740disks md1400_1 exit
     
            do
            case $rep in
            r740disks) break;;
            md1400_1) break;;
            exit) exit;;
            esac
            done
     
            echo $rep > /root/backup_logs/$vol.log
     
            destsize=`df | grep $rep | awk '{ print $4 }'`
            destsizeh=`df -h | grep $rep | awk '{ print $4 }'`
            sourcesize=`df | grep $vol | awk '{ print $3 }'`
            sourcesizeh=`df -h | grep $vol | awk '{ print $3 }'`
            sourcesize2=`df -h | grep $vol | awk '{ print $2 }'`
            echo source : $vol $sourcesizeh/$sourcesize2 "|" destination : $rep $destsizeh
            if [ $sourcesize -gt $destsize ]
            then echo "Destination trop petite !" exit;
            fi
            source="/netapp/$vol"
            dest="/mnt/$rep/volumes/"
            cmd="rsync -ah -e ssh --exclude=.snapshot $source $dest 2>> /root/backup_logs/$vol.log"
            mail -s "Backup NFS Ganil" toto@hotmail.fr <<< "La copie s'effectue de $source vers $dest."
            echo $cmd
            eval $cmd
            mail -s "Backup NFS Ganil" toto@hotmail.fr  <<< "La copie de $source vers $dest est terminée !"
            exit
    fi
    done
     
    elif [ "$test" == "schedule" ] ; then
     
    #liste le fichier le plus vieux du répertoire
    old=`ls -t /root/backup_logs/ | tail -1`
    old=${old:0:-4}
    echo Incrémentale de $old
    rep=`sed -n 1p /root/backup_logs/$old.log`
    source="/netapp/$old"
    dest="/mnt/$rep/volumes/"
    echo Destination : $rep
            if [ -d "$dest" ]; then
                    cmd="rsync -ah -e ssh --exclude=.snapshot $source $dest 2>> /root/backup_logs/$old.log"
                    mail -s "Backup NFS Ganil" toto@hotmail.fr <<< "La copie s'effectue de $source vers $dest"
     
                    echo $cmd
                    eval $cmd
     
                    mail -s "Backup NFS Ganil" toto@hotmail.fr <<< "La copie de $source vers $dest est terminée !"
            else
                    echo "Le répertoire $dest n'est pas présent, vous allez sortir" exit;
            fi
    fi


    NOM DU SCRIPT : backup_ganil_cifs.sh

    COMPATIBLE : powershell

    Descriptif : permet le backup d'un serveur à un autre

    Et le voici mais avec robocopy :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    # SCRIPT PARAM
    param([string] $arg1)
     
    #VARS
    $expediteur = "titi@hotmail.fr"
    $destinataire = "toto@hotmail.fr"
    $serveur = "mail.toto.fr"
     
    #Robocopy est en marche ou pas ?
    $programName = "robocopy"
    $isRunning = (Get-Process | Where-Object { $_.Name -eq $programName }).Count -gt 1
     
    if ($isRunning)
    {
    	echo "ROBOCOPY IS RUNNING, exiting..." ; exit
    	echo "ROBOCOPY IS RUNNING, exiting..." | Out-File -FilePath C:\Users\bckcifs\Desktop\robocopy_out.txt
    }
    else 
    {
    	echo "ROBOCOPY IS NOT RUNNING !" 
    	echo "ROBOCOPY IS NOT RUNNING !" | Out-File -FilePath C:\Users\bckcifs\Desktop\robocopy_out.txt
    }
     
    # liste des volumes
    $volumes = New-Object 'System.Collections.Generic.Dictionary[String,String]'
    $fichier = "C:\Users\bckcifs\Desktop\cifs_volumes.txt"
    $fichiercontenu = get-content $fichier
     
    foreach($source in $fichiercontenu)
    {
    	$dum,$dum2,$server,$vol = $source.split("\\")	
    	$volumes.Add($vol, $source)
    }
     
    # VERSION INTERACTIVE
    if([string]::IsNullOrEmpty($arg1))
    {
    	foreach($volume in $volumes.GetEnumerator())
    	{		
    		$vol = $volume.Key
    		$source = $volume.Value
     
    		#Vérifier la présence des fichiers de log des volumes :
    		if (Test-Path("C:\Users\bckcifs\Desktop\backups_logs\$vol.log"))
    		{	
    			continue;							
    		}
    		else 
    		{
    			Write-Host $source
     
    			if([string]::IsNullOrEmpty($source) -or(-Not (Test-Path("$source"))) ) { echo "$source Introuvable"; continue; }
     
    			# tester taille volumes : 
    			# test montage destination
     
    			$dest=Read-Host "Choisissez une destination : [1] (E:\volumes) | [2] (Z:\)"
    			Switch ($dest)
    			{
    				1 { $dest="E:\volumes" }
    				2 { $dest="Z:\" }					
    			}
     
     
    			if([string]::IsNullOrEmpty($dest) -or (-Not (Test-Path("$dest"))) ) { echo "Destination introuvable"; exit }
     
    			$dest+="\$vol"	
     
    			$dest > C:\Users\bckcifs\Desktop\backups_logs\$vol.log 
     
     
    			#MAIL DEBUT		
    			$objet = "Backup CIFS Ganil  " + (Get-Date -format 'd MM yyyy')
    			$texte = "La copie s'effectue de $source vers $dest"
    			$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
    			$SMTPclient = new-object System.Net.Mail.SmtpClient $serveur
    			$SMTPclient.Credentials = [System.Net.CredentialCache]:<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />efaultNetworkCredentials
    			$SMTPclient.Send($message)
     
    			$cmd = "robocopy $source $dest /XD '.bplusvtoc' '.vtoc' '.snapshot' /R:0 /W:0 /TEE /NP /MIR /SEC /SECFIX /NJS /NJH /NDL /NFL /NC /NS /UNILOG+:C:\Users\bckcifs\Desktop\backups_logs\$vol.log"
    			echo $cmd
    			iex $cmd
     
    			#MAIL FIN	
    			$logfile1 = "C:\Users\bckcifs\Desktop\backups_logs\$vol.log"
    			$objet = "Backup CIFS Ganil  " + (Get-Date -format 'd MM yyyy')
    			$texte = "La copie $source vers $dest est terminée."
    			$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
    			$attachment = new-object System.Net.Mail.Attachment $logfile1
    			$message.Attachments.Add($attachment)
    			$SMTPclient = new-object System.Net.Mail.SmtpClient $serveur
    			$SMTPclient.Credentials = [System.Net.CredentialCache]:<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />efaultNetworkCredentials
    			$SMTPclient.Send($message) 
     
    			exit
    		}
    	}
     
    }	# fin version interactive
    elseif($arg1 -eq "schedule")
    {
     
    	Write-Output "$(Get-Date -format 'd/MM/yyyy')" | Out-File -FilePath C:\Users\bckcifs\Desktop\robocopy_out.txt
     
    	#Comparer les dates des fichiers et sortir le plus anciens
    	$date1 = ''
    	$oldest = ''
    	$olddate = ''
     
    	foreach ($vol in Get-ChildItem -Path "C:\Users\bckcifs\Desktop\backups_logs\" *.log -File)
    	{		
     
    		if (!$olddate) { $oldest = $vol.Name; $olddate = $vol.LastWriteTime.ToString("yyyy-MM-dd H:m:s");}  
    		else
    		{
    			if ($vol.LastWriteTime.ToString("yyyy-MM-dd H:m:s") -lt $olddate)
    			{ 						
    				$oldest = $vol.Name; 
    				$olddate =  $vol.LastWriteTime.ToString("yyyy-MM-dd H:m:s")				
    			}
    		}		
    	}
     
    	$oldvol = $oldest.Split(".")
    	$src = $volumes[$oldvol]
    	$dest = (Get-Content -Path C:\Users\bckcifs\Desktop\backups_logs\$oldest -totalcount 1)
     
    	if( [string]::IsNullOrEmpty($src) -or (-Not (Test-Path("$src"))) ) { echo "Source Introuvable"; exit }
    	if( [string]::IsNullOrEmpty($dest) -or (-Not (Test-Path("$dest"))) )	{ echo "Destination introuvable"; exit }
     
    	$dest > C:\Users\bckcifs\Desktop\backups_logs\$oldest
    	$olddate >> C:\Users\bckcifs\Desktop\backups_logs\$oldest 
     
     
    	# MAIL DEBUT DE SAUVEGARDE
    	$objet = "Backup CIFS Ganil " + (Get-Date -format 'd MM yyyy')
    	$texte = "La copie s'effectue de $src vers $dest"
    	$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
    	$SMTPclient = new-object System.Net.Mail.SmtpClient $serveur
    	$SMTPclient.Credentials = [System.Net.CredentialCache]:<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />efaultNetworkCredentials
    	$SMTPclient.Send($message)
     
    	# ROBOCOPY
    	$cmd = "robocopy $src $dest /XD '.bplusvtoc' '.vtoc' '.snapshot' /R:0 /W:0 /E /TEE /NP /MIR /SEC /SECFIX /NJS /NJH /NDL /NFL /NC /NS /UNILOG+:C:\Users\bckcifs\Desktop\backups_logs\$oldest"
    	echo $cmd
    	echo "Debut de la sauvegarde auto..." $cmd >> C:\Users\bckcifs\Desktop\robocopy_out.txt	
    	iex $cmd
     
    	# MAIL FIN
    	$logfile = "C:\Users\bckcifs\Desktop\backups_logs\$oldest"
    	$objet = "Backup CIFS Ganil  " + (Get-Date -format 'd MM yyyy')
    	$texte = "La copie de $src vers $dest est terminée."
    	$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
    	$attachment = new-object System.Net.Mail.Attachment $logfile
    	$message.Attachments.Add($attachment)
    	$SMTPclient = new-object System.Net.Mail.SmtpClient $serveur
    	$SMTPclient.Credentials = [System.Net.CredentialCache]:<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />efaultNetworkCredentials
    	$SMTPclient.Send($message)
     
    	echo "Fin de sauvegarde" >> C:\Users\bckcifs\Desktop\robocopy_out.txt
    }


    CDLT
      0  0

  8. #68
    Modérateur

    tu ne peux pas utiliser /bin/sh ET des tableaux.
    et ==, non plus, n'est pas POSIX

    le tableau associatif et les tripotages relatifs sont inutiles
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    nb2rsync=$(pgrep -c rsync)
    if test $nb2rsync -gt 1
    ...


    grep | awk aussi est inutile : awk gère les regex !
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  9. #69
    Nouveau membre du Club
    Je ne peux pas utiliser de tableau ?? cette fonction marche très bien et à était vérifier par mon DSI puis le script est en production sur les serveurs maintenant et aucun problème de se côtés la. Le rsync ne peut être lancer plus de deux fois.

    Et peut-être que c'est moi qui devient fou mais où a tu vus des "==" ???? J'ai relus plusieurs fois mon script mais pas vue et je ne me souviens pas du tout avoir misa ça.

    Je test quand même la solution !
    Il faut apprendre, non pas pour l'amour de la connaissance, mais pour se défendre contre le mépris dans lequel le monde tient les ignorants.

    Apprendre sans réfléchir est vain. Réfléchir sans apprendre est dangereux.



    Oh et allez checker pour plein d'amour pour le jeux vidéal : https://www.instant-gaming.com/igr/derisoir/
    Cordialement.

  10. #70
    Modérateur

    non. /bin/sh ne supporte pas les tableaux.
    sur vos machines /bin/sh est probablement un lien vers /bin/bash , mais ce n'est pas toujours le cas, et alors le script ne fonctionnera plus.
    il faut adapter le shebang pour que le noyau utilise bien bash.

    == ligne 81
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  11. #71
    Nouveau membre du Club
    Donc je dois simplement remplacer sh par bash ?

    Effectivement le double égale est présent. Mais un seul égale fera marcher l'histoire ?

    Je pose les questions avant car comme je l'ai dit c'est en production
    Il faut apprendre, non pas pour l'amour de la connaissance, mais pour se défendre contre le mépris dans lequel le monde tient les ignorants.

    Apprendre sans réfléchir est vain. Réfléchir sans apprendre est dangereux.



    Oh et allez checker pour plein d'amour pour le jeux vidéal : https://www.instant-gaming.com/igr/derisoir/
    Cordialement.

  12. #72
    Modérateur

    oui, ou alors tu rends ton script strictement POSIX.
    et oui.
    le double égal n'a de "sens" que entre [[ ]] pour exprimé l'usage de tests avancés introduits par les crochets doubles.
    c'est aussi une extensions de bash.

    EDIT:
    vérifié par mon DSI
    pfff.
    je ne demanderais pas à mon fils qui conduit un engin de chantier (pourtant équipé un marteau pneumatique) de regarnir la tapisserie de mon fauteuil Voltaire.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  13. #73
    Nouveau membre du Club

    pfff.
    je ne demanderais pas à mon fils qui conduit un engin de chantier (pourtant équipé un marteau pneumatique) de regarnir la tapisserie de mon fauteuil Voltaire.
    Je trouve cette réponse un peu.... Il faut bien commencer pour apprendre évidement le script peut toujours être améliorer. Et il faut avoir confiance

    Merci pour les réponse j'ai déjà changer pour le "==" mais je comprend toujours pas pourquoi pour le tableau désolé

    il faut évidement aussi expliquer pour certains qui ont du mal à comprendre, ce n'est pas toujours évident.
    Il faut apprendre, non pas pour l'amour de la connaissance, mais pour se défendre contre le mépris dans lequel le monde tient les ignorants.

    Apprendre sans réfléchir est vain. Réfléchir sans apprendre est dangereux.



    Oh et allez checker pour plein d'amour pour le jeux vidéal : https://www.instant-gaming.com/igr/derisoir/
    Cordialement.

  14. #74
    Nouveau membre du Club
    Ah les jeunes... fougueux, déterminé... parfois trop, d'où le pourquoi de l'incompréhension de certaine choses parfois évidente pour d'autre.
    Il faut apprendre, non pas pour l'amour de la connaissance, mais pour se défendre contre le mépris dans lequel le monde tient les ignorants.

    Apprendre sans réfléchir est vain. Réfléchir sans apprendre est dangereux.



    Oh et allez checker pour plein d'amour pour le jeux vidéal : https://www.instant-gaming.com/igr/derisoir/
    Cordialement.

  15. #75
    Modérateur

    je vise le DSI qui a des compétences trop importantes pour juger de la qualité d'un simple script.
    en l'occurrence, qui peut le plus ne peut pas le moins.
    je ne sais pas faire ce qu'il fait, mais sa pratique du shell est manifestement poussiéreuse.
    quand on a des objectifs élevés, c'est une chose sur laquelle on passe très rapidement, en la survolant de loin.

    quant au tableau, que dire ?
    les shells ont des capacités différentes. un script POSIX n'a pas ce qu'il faut pour créer et gérer des tableaux. certaines versions de ksh peuvent gérer des objets, pas bash.
    les versions précédentes de bash ne pouvaient pas gérer les tableaux associatifs - /bin/sh (s'il n'est pas un lien vers bash) ne sait pas gérer les tableaux !
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  16. #76
    Nouveau membre du Club
    D'accord j'ai un peu près compris. J'ai changé sh par bash et le "==" par "=" simple.

    Et j'ai changé de DSI :$ pas drôle...
    Il faut apprendre, non pas pour l'amour de la connaissance, mais pour se défendre contre le mépris dans lequel le monde tient les ignorants.

    Apprendre sans réfléchir est vain. Réfléchir sans apprendre est dangereux.



    Oh et allez checker pour plein d'amour pour le jeux vidéal : https://www.instant-gaming.com/igr/derisoir/
    Cordialement.

  17. #77
    Rédacteur

    Bonjour.

    Faut pas hésiter à approfondir ses connaissances du shell en général et de bash en particulier, on a pleins de cours très accessibles aux débutants et mêmes utiles aux confirmés. Je te recommande de commencer par ceci puis une fois que c'est fait, poursuivre avec cela et pour un peu de pratique sur des exercices faciles en parallèle et la FAQ.

    Les exercices et les cc/cl de solutions toutes faites sont très productifs pour apprendre mais loin d'être suffisants, il faut aussi comprendre les apports de bash par rapport au sh POSIX et bien comprendre que bien souvent on confond les deux et en plus le choix des distributions linux de faire des liens symboliques de sh vers bash ou dash contribuent à mon sens au manque de maîtrise approfondie de ces technos.

    Sur ce forum, plusieurs membres challengent au-delà des simples considérations de "ça marche", "ça marche pas" et "on l'a testé au travail ou à l'école avec mon prof/DSI/team leader/CTO/et qui sais-je" comme on peut le voir sur d'autres forums cela permet ainsi à tout le monde de monter en compétence et de surtout maîtriser et comprendre se qu'ils sont en train de faire et si possible d'avoir les solutions les plus optimales possibles (le plus important c'est de comprendre ce qu'on fait et comment ça marche et de chercher à aller plus loin dans la maîtrise). Et du coup quasiment tout les conseils qui sont donnés "c'est pas comme ça qu'il faut lire un fichier, utiliser les tableau, etc" trouvent leur echo dans les cours que j'ai cité plus haut pour approfondir.

    Idriss

  18. #78
    Nouveau membre du Club
    Bonjour Idriss,

    Merci pour cette réponse. Je suis allé voir ceci et cela

    CDLT
    Il faut apprendre, non pas pour l'amour de la connaissance, mais pour se défendre contre le mépris dans lequel le monde tient les ignorants.

    Apprendre sans réfléchir est vain. Réfléchir sans apprendre est dangereux.



    Oh et allez checker pour plein d'amour pour le jeux vidéal : https://www.instant-gaming.com/igr/derisoir/
    Cordialement.

###raw>template_hook.ano_emploi###