Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/11/2012, à 12:00

touttou

[Résolu] Shell script

bonjour tout le monde,
je suis débutante en linux et j'ai un exercice Shell que j'ai essayé mais ça m'a pas marché
énoncé : écrire un script shell qui fait appel à une fonction  fnCompress qui compresse (gzip) un fichier passé en paramètre,s'il existe et s'il ne l'ai pas déjà .

le code que j'ai écrit:
#! /bin/shell
function fnCompress()
{if [ -e $1 -a  $1 != *.gz];
then
gzip $1
fi }
fnCompress $1;

merci d'avance

Dernière modification par touttou (Le 11/11/2012, à 21:26)

Hors ligne

#2 Le 11/11/2012, à 14:16

Bousky

Re : [Résolu] Shell script

Quelques remarques d'ordre général :

  1. Pour poster du code (ou des retours de terminal, des fichiers,… ), utilise la balise « code » (bt_pre.png au dessus de la zone de saisie).

  2. Si tu veux de l'aide pour faire marcher du code, la moindre des choses est de nous indiquer l'erreur renvoyée.


Sur ton code à proprement parler :

  1. « /bin/shell » n'existe pas. Il faut choisir le shell que tu veux utiliser. Le langage peut-être très proche ou totalement différent de l'un à l'autre :

    • /bin/sh     → standard mais un peu limité ;

    • /bin/bash → presque standard, une extension de sh ;

    • /bin/dash → pas standard, une autre extension de sh ;

    • ksh, csh, tcsh, …

    Je te conseille sh ou bash.

  2. « { » doit-être sur la même ligne que le nom de la fonction.

  3. « } » doit être sur une ligne à part (ou précédé d'un point-virgule).

  4. « ] » doit être précédé d'un espace. De manière générale, il faut faire très attention aux espaces dans « [ … ] ».

  5. Il faut toujours mettre des guillemets doubles autour des variables. Dire qu'un script ne supporte pas les noms de fichiers avec des espaces car on a eu la flemme de mettre des guillemets devrait être passible de la peine capitale.

  6. « $1 != *.gz » (« "$1" != *.gz » en tenant compte de la remarque précédente) veut dire « $1 est différent de la liste des fichiers .gz du dossier courant ». C'est-à-dire que si tu as deux fichiers « a.gz » et « b.gz », ton test est équivalent à « $1 != a.gz b.gz ». Ce n'est pas ce que tu veux et tu aurais une erreur car $1 sera comparé à a.gz et il ne saura pas quoi faire de b.gz. Il faut soit :

    • Utiliser les regex (uniquement avec bash) : « [[ "$1" =~ \.gz$ ]] » ;

    • Extraire l'extension et la tester : « [ "${1##*.}" = gz ] »

Dernière modification par Bousky (Le 11/11/2012, à 14:19)


Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)

Hors ligne

#3 Le 11/11/2012, à 20:57

Postmortem

Re : [Résolu] Shell script

Salut,

Bousky a écrit :

Il faut soit :
Utiliser les regex (uniquement avec bash) : « [[ "$1" =~ \.gz$ ]] » ;
Extraire l'extension et la tester : « [ "${1##*.}" = gz ] »

Ou utiliser les doubles crochets en bash (le développement des chemins ne se fait pas entre les double-crochets, ni le découpage en mots) :

[[ "$1" != *.gz ]]

Et ici, que la valeur de $1 contienne ou pas une espace, les double-quotes ne sont pas obligatoires.

Edit :
Le if serait donc ainsi en bash :

if [[ -e $1 && $1 != *.gz ]]

Dernière modification par Postmortem (Le 11/11/2012, à 22:00)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#4 Le 11/11/2012, à 21:26

touttou

Re : [Résolu] Shell script

Merci à vous deux smile

Hors ligne