2010-10-18 4 views
0

Voici un code source qui prend « fichiers » dans seulement, répertorie les autorisations de fichier d'un fichier et imprime la sortie en remplaçantErreur logique dans l'aide Shell script.Please (UNIX)

r = READ, w -WRITE, x-EXECUTABLE.

Il devrait également écho « utilisateur » .Mais l'est ici Mon problème que j'ai remplacé « - » par l'utilisateur mais si le fichier a une autorisation de r - x, elle aussi de l'impression " Utilisateur "@ ce point.Je sais que ce n'est pas une façon correcte de s'y prendre.Peut-on me suggérer une meilleure façon de faire écho" Utilisateur ".

J'ai aussi essayé de l'imprimer avant de la boucle, mais il ne servira pas mon but, comme mon programme ne fonctionne que les autorisations de fichiers cep d'un FICHIERet non un bloc/prise/tuyau/répertoire/etc.

#!/bin/bash 

    if [ $# -lt 1 ];then 
     echo "USAGE: $0 file-name" 
     exit 1 
    fi 


    ls -l $1 | cut -c1-4 | tr "\012" "." > fp 


    i=1 

    while(($i <= 4)) 
    do 
     p=`cat fp | cut -c$i` 

     case $p in 

     [dbsplc] | t) echo "not a file"; 
      exit 1;; 
     -) echo "User";; 
     r) echo "READ";; 
     w) echo "WRITE";; 
     x) echo "EXECUTE";; 

     esac 

     ((++i)) 
    done 


    exit 0 
+0

Quand faut-sortie « Utilisateur » ? Juste quand c'est un fichier régulier? –

Répondre

0

Cela a servi mon but, je me suis séparé la première condition dans un cas autre instruction .:

#!/bin/bash 

if [ $# -lt 1 ];then 
    echo "USAGE: $0 file-name" 
    exit 1 
fi 


ls -l $1 | cut -c1-4 | tr "\012" "." > fp 


i=1 
while(($i == 1)) 
do 
    p=`cat fp | cut -c$i` 

    case $p in 

    [dbsplc] | t) echo "not a file"; 
     exit 1;; 
esac 

    echo "User" 
    ((++i)) 
done 



while(($i <= 4)) 
do 
    p=`cat fp | cut -c$i` 

    case $p in 
    r) echo "READ";; 
    w) echo "WRITE";; 
    x) echo "EXECUTE";; 

    esac 

    ((++i)) 
done 


exit 0 
+1

Il n'y a absolument aucune raison d'utiliser le premier 'while' - il sera toujours exécuté et seulement une fois. Le deuxième 'while' devrait être une boucle' for' à la place: 'for i dans {2..4}'. Il n'est pas nécessaire d'utiliser 'cat'. En fait, le fichier temporaire et tous les utilitaires externes sont également inutiles puisque vous pouvez enregistrer les données dans une variable et utiliser l'analyse de sous-chaîne de Bash pour sélectionner les caractères individuels '$ {var: i: 1}'. Cependant, la réponse de Glenn Jackman est la voie à suivre. –

+0

@ Dennis Williamson - OK.Je suis un novice.J'ai donc fait ce que je pensais simple pour moi de comprendre.J'essayerai sûrement aussi l'approche de Glenn Jackman.Thankyou pour les conseils .. – Pavitar

1

Je voudrais simplement utiliser stat -c %a et traiter à la place.

+0

Il suffit de noter que stat n'est pas portable (BSD ne l'ai pas je pense) – Daenyth

+0

Pourriez-vous être un peu plus précis.Je suis un novice, merci. – Pavitar

+0

@Pavitar: Essayez-vous d'abord, * puis * poser d'autres questions. –

0

un exemple en utilisant awk (facilement adaptable à votre programme)

ll |awk '{ 
      rights=substr($1, 2, 3); 
      sub(/r/, "READ ", rights); 
      sub(/w/, "WRITE ", rights); 
      sub(/x/, "EXECUTE ", rights); 
      print rights $3 
      }' 

Explications:

rights=substr($1, 2, 3); 

$ 1 contient les droits de votre programme et nous ne prend que les 3 premiers droits (utilisateur un)

sub(/r/, "READ ", rights); 

Substituer "r" avec READ dans les droits (et ainsi de suite).

print rights $3 

Droits d'impression (substitués) et $ 3 contenant le nom d'utilisateur.

4

Trop compliqué. Vous ne devez pas compter sur ls du tout:

#!/bin/bash 

if [[ $# -lt 1 ]]; then 
    echo "USAGE: $(basename "$0") filename ..." 
    exit 1 
fi 

exit_status=0 

for file in "[email protected]"; do 
    if [[ ! -f "$file" ]]; then 
     echo "not a file: $file" >&2 
     exit_status=$((exit_status + 1)) 
     continue 
    fi 

    echo "$file:" 
    echo "User" 

    [[ -r "$file" ]] && echo "READ" 
    [[ -w "$file" ]] && echo "WRITE" 
    [[ -x "$file" ]] && echo "EXECUTE" 
done 

exit $exit_status