IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Linux Discussion :

Le résultat d'une commande dans une variable ?


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 53
    Points : 16
    Points
    16
    Par défaut Le résultat d'une commande dans une variable ?
    Je veux faire un script qui permet d'afficher les droits d'un utilisateur sur ses fichiers, en toute lettre.

    $1 étant la variable qui contient le nom de mon fichier.

    En faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls -l $1 | cut -c 2,3,4
    j'aimerais faire en sort que lorsque la commande cut -c 2 affiche r s'affiche lecture, lorsque la commande cut -c affiche w s'affiche écriture et lorsque la commande cut -c affiche x s'affiche exécution.

    Comment puis-je faire cela ?

    Merci d'avance pour votre aide.

  2. #2
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 53
    Points : 16
    Points
    16
    Par défaut
    j'essaye de faire ca comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    r='ls -l $1 |cut -c 2'
    w='ls -l $1 |cut -c 3'
    x='ls -l $1 |cut -c 4'
     
    if [ $r = r ] ; then
    echo "Lecture"
    fi
    if [ $w = w ] ; then 
    echo "Ecriture"
    fi 
    if [ $x = x ] ; then
    echo "Exécution"
    fi
    mais ca me met un message d'erreur :

    ./tp: line 33: [: trop d'arguments
    ./tp: line 36: [: trop d'arguments
    ./tp: line 39: [: trop d'arguments

    Quelqu'un possède la solution ?

  3. #3
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Ce que tu veux, marche avec ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    r=`ls -l $1 |cut -c 2`
    ou
    r=$(ls -l $1 |cut -c 2)

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 043
    Points
    31 043
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kilkikou Voir le message
    j'essaye de faire ca comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    r='ls -l $1 |cut -c 2'
    w='ls -l $1 |cut -c 3'
    x='ls -l $1 |cut -c 4'
     
    if [ $r = r ] ; then
    echo "Lecture"
    fi
    if [ $w = w ] ; then 
    echo "Ecriture"
    fi 
    if [ $x = x ] ; then
    echo "Exécution"
    fi
    mais ca me met un message d'erreur :

    ./tp: line 33: [: trop d'arguments
    ./tp: line 36: [: trop d'arguments
    ./tp: line 39: [: trop d'arguments

    Quelqu'un possède la solution ?
    C'est assez courant en shell lorsque tu remplis une variable puis que tu la compares style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    read var
    test $var = ...
    Si la variable est mal remplie, le shell voit
    Et là, il aime pas car il lui faut impérativement un élément à mettre avant le "="

    => Solution => mettre des guillemets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    read var
    test "$var" = "..."
    => Là, même si la variable est vide, il y aura quand-même quelque chose à comparer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [ "$r" = "r" ] && echo "Lecture"
    [ "$w" = "w" ] && echo "Ecriture"
    [ "$x" = "x" ] && echo "Exécution"
    Autre danger (spécifique à ton exercice) => si les bits spéciaux sont positionnés (sst), ils viendront masquer le "x" donc il te faut le vérifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ "$x" = "x" -o "$x" = "s" -o "$x" = "t" ] && echo "Exécution"

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Points : 329
    Points
    329
    Par défaut
    Au lieu de faire plusieurs commandes "ls" (pour éviter des accès excessifs sur des gros fichiers par exemple) :

    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
     
    FILENAME="/path/to/file"
     
    val=$(stat -c %A $FILENAME | cut -c "2 3 4")
    r=`echo ${val:0:1}`
    w=`echo ${val:1:1}`
    x=`echo ${val:2:1}`
     
    case "$r" in
    "r")
      echo "Lecture"
    ;;
    esac
     
    case "$w" in
    "w")
      echo "Ecriture"
    ;;
    esac
     
    case "$x" in
    "x")
      echo "Execution"
    ;;
    esac

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 043
    Points
    31 043
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tamiel Voir le message
    Au lieu de faire plusieurs commandes "ls" (pour éviter des accès excessifs sur des gros fichiers par exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    FILENAME="/path/to/file"
     
    val=$(stat -c %A $FILENAME | cut -c "2 3 4")
    r=`echo ${val:0:1}`
    w=`echo ${val:1:1}`
    x=`echo ${val:2:1}`
     
    <...>
    case "$x" in
    "x")
      echo "Execution"
    ;;
    esac
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    case $x in
    [xst])
      echo "Execution"
    ;;
    esac

Discussions similaires

  1. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  2. Réponses: 4
    Dernier message: 02/07/2008, 11h32
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo