Rechercher : dans
Par :

Exercice en shell

Dernière réponse le 12 fév 2008 à 03:32:30 yacine, le 11 mai 2007 à 12:46:32 
 Signaler ce message aux modérateurs

L'exo en script bash consiste à lire à partir d'un argument $1 qui sera le fichier , et à en déduire les permissions du propriétaire du groupe et des autres (o)de telle sorte avec en sortie par exemple cette forme là :

read write execute

user moi oui oui oui
group le groupe oui non non
others les autres oui non non

je débute alors j'ai du mal , voici ce que j'ai fait pour la partie la plus importante du script

!#/bin/bash
i=2 ( i compteur )
while ($i -lt 9 ) ( on part de 2 car le 1 er caractere sera le type ex -rwxrw-r--)
if ( cut -c$i | ls -l $1 == [a-z]
echo"oui"
else
echo "non"
fi
i=i+1
done


merci pour votre aide

Configuration: Windows XP
Firefox 1.5.0.11

Meilleures réponses pour « exercice en shell » dans :
Guide d'utilisation du Shell pour débutant VoirSHELL BASH - GUIDE D'UTILISATION - Niveau Débutant Introduction Appel aux membres CCM II. C'est quoi le shell ? III. Comment accéder à la ligne de commande IV. Les consoles virtuelles Exemple : Accéder à la console 3 depuis l'interface...
[Shell] Transferer des fichiers via ssh VoirSSH - Secure SHell Utilisation Informations complémentaires LOGICIELS Sous Linux/Unix Sous Windows Avertissement Utilisation SSH permet d'utiliser des pipelines de commandes, et d'utiliser des tubes d'entrées/sorties comme toute...
[Shell] Tester une variable numérique VoirTester une variable numérique    Préambule Dans un environnement "shell", les variables sont, par défaut, de type "chaîne de caractères". De ce fait il n'est pas possible de déclarer une variable de type "entier" (enfin, ceci n'est pas tout à...
Linux - Le shell VoirIntroduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire le système...
Systèmes UNIX - Le shell VoirIntroduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire entre le système...

1

lami20j, le 11 mai 2007 à 14:14:49

Salut,

quelque chose comme ça?!
le script

lami20j@debian:~/trash$ cat lister_droits.sh
#!/bin/bash

droits=$(ls -l $1 | cut -d' ' -f1)
user=$(ls -l $1 | cut -d ' ' -f3)
groupe=$(ls -l $1 | cut -d ' ' -f4)

u=${a:1:3} # user
g=${a:4:3} # group
o=${a:7:3} # other

echo user:$user
echo -e "group:$groupe\n"

echo -e "    \t\tread\t\twrite\t\texecute"

echo -e "user\t\c"
echo $u | sed s/[rwx]/\\toui\\t/g | sed s/-/\\tnon\\t/g

echo -e "groupe\t\c"
echo $g | sed s/[rwx]/\\toui\\t/g | sed s/-/\\tnon\\t/g

echo -e "autres\t\c"
echo $o | sed s/[rwx]/\\toui\\t/g | sed s/-/\\tnon\\t/g
ls sur le fichier
lami20j@debian:~/trash$ ls -l test01.txt
-rw-r--r-- 1 lami20j lami20j 64 2007-05-10 19:06 test01.txt
exécution de script
ami20j@debian:~/trash$ sh lister_droits.sh test01.txt
user:lami20j
group:lami20j

                read            write           execute
user            oui             oui             non
groupe          oui             non             non
autres          oui             non             non
--
lami20j

Répondre à lami20j

2

yacine, le 11 mai 2007 à 14:36:23

Merci pour ta réponse lami20j , on a pas encore vu les fcts "sed" ni le type
{a:1:3} ça correspond à quoi ??
on doit le faire avec les boucles , mais si je trouve pas , je prends ta méthode que je suis en train de tester et qui a l'air de marcher ;
yacine

Répondre à yacine

4

lami20j, le 11 mai 2007 à 16:56:38

Re,

une petite corection
au lieu de
droits=$(ls -l $1 | cut -d' ' -f1)
écrit

a=$(ls -l $1 | cut -d' ' -f1)

sed n'est pas une fonction
regarde ici sed et ici sed

{a:1:3} ça correspond à quoi ??
regarde ici man bash

${paramètre:début:longueur}
Extraction de sous-chaîne Se développe pour fournir la sous-chaîne de la longueur indiquée (en caractères) commençant au début.D offset. Si la longueur est omise, fournit la sous-chaîne commençant au caractère de début et s'étendant jusqu'à la fin du paramètre. La longueur et le début sont des expressions arithmétiques (voir ÉVALUATION ARITHMÉTIQUE plus bas). La longueur doit être positive ou nulle. Si le début est négatif, sa valeur est considérée à partir de la fin du contenu du paramètre. Si le paramètre est @, le résultat correspond aux longueur paramètres positionnels commençant au début. Si le paramètre est un nom de tableau indexé par @ ou *, le résultat est les longueur membres du tableau commençant à ${paramètre[début]}. L'indexation des sous-chaînes débute à zéro, sauf pour les paramètres positionnels qui débute en 1.

lami20j

Répondre à lami20j

3

jipicy, le 11 mai 2007 à 14:56:22

Salut,

Autre solution (assez proche) :

#! /bin/bash

echo -e "\tread\twrite\texecute\n"

read user group others < <(stat -c "%A" $1 | sed -e 's/-//;s/.../& /g')
echo -e "User\c"; echo $user | sed 's/[rwx]/\toui/g;s/-/\tnon/g'
echo -e "group\c"; echo $group | sed 's/[rwx]/\toui/g;s/-/\tnon/g'
echo -e "Others\c"; echo $others| sed 's/[rwx]/\toui/g;s/-/\tnon/g'
Rend le script exécutable et lances-le par :
./le_script
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

5

yacine, le 13 mai 2007 à 11:41:11

En effet avec la commande sed c mieux !
merci bcp à tous les 2 pour vos réponses ;

Répondre à yacine

6

yacine, le 16 mai 2007 à 15:05:20

Re bonjour ,
en fait on nous le demande de le faire sans les commandes SED et AWK, alors comment remplacer des caracteres sans sed ?

Répondre à yacine

7

jipicy, le 16 mai 2007 à 17:45:43

Re-

Essaye ça alors :

#! /bin/bash

var=$(ls -l "$1" | cut -d" " -f1)
usere=$(echo "$var" | cut -c2-4)
groupe=$(echo "$var" | cut -c5-7)
autres=$(echo "$var" | cut -c8-10)

echo -e "$usere\n$groupe\n$autres" > fichier.txt
echo -e "\t\tread\twrite\texecute\n"

i=1
while read line
do
if [ "$i" == 1 ]
then param=user
elif [ "$i" == 2 ]
then param=groupe
else param=others
fi
case "$line" in
---)    echo -e "$param\t\tnon\tnon\tnon"
        ;;
--x)    echo -e "$param\t\tnon\tnon\toui"
        ;;
-w-)    echo -e "$param\t\tnon\toui\tnon"
        ;;
-wx)    echo -e "$param\t\tnon\toui\toui"
        ;;
r--)    echo -e "$param\t\toui\tnon\tnon"
        ;;
r-x)    echo -e "$param\t\toui\tnon\toui"
        ;;
rw-)    echo -e "$param\t\toui\toui\tnon"
        ;;
rwx)    echo -e "$param\t\toui\toui\toui"
        ;;
esac
i=$(expr $i + 1)
done < fichier.txt
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

8

lami20j, le 16 mai 2007 à 19:06:04

Salut,

autre solution :-))
Le script

lami20j@debian:~/trash$ cat ccm.sh
#!/bin/bash

a=$(ls -l $1 | cut -d' ' -f1)
user=$(ls -l $1 | cut -d ' ' -f3)
groupe=$(ls -l $1 | cut -d ' ' -f4)

u=${a:1:3} # user
g=${a:4:3} # group
o=${a:7:3} # other

echo user:$user
echo -e "group:$groupe\n"
echo -e "    \t\tread\t\twrite\t\texecute"

uu=${u//[rwx]/"\toui\t"}
echo -e "user\t\c"
echo -e ${uu//-/"\tnon\t"}

gg=${g//[rwx]/"\toui\t"}
echo -e "groupe\t\c"
echo -e ${gg//-/"\tnon\t"}

oo=${o//[rwx]/"\toui\t"}
echo -e "autres\t\c"
echo -e ${oo//-/"\tnon\t"}

Le résultat
lami20j@debian:~/trash$ ls -l fichier
-rwxrw-r-- 1 lami20j lami20j 81 2007-05-15 19:53 fichier
lami20j@debian:~/trash$ sh ccm.sh fichier
user:lami20j
group:lami20j

                read            write           execute
user            oui             oui             oui
groupe          oui             oui             non
autres          oui             non             non
lami20j

Répondre à lami20j

9

yacine, le 16 mai 2007 à 19:42:57

Ah merci beaucoup pour vos réponses ,je suis en train de tester , mais le pire c est qu'ils demandent une réponse en moins de 16 lignes ....

Répondre à yacine

10

lami20j, le 16 mai 2007 à 19:58:42

Ton prof est un c** :-DDD

Voilà en 13 lignes

lami20j@debian:~/trash$ cat ccm.sh
#!/bin/bash
a=$(ls -l $1 | cut -d' ' -f1)
user=$(ls -l $1 | cut -d ' ' -f3)
groupe=$(ls -l $1 | cut -d ' ' -f4)
u=${a:1:3} g=${a:4:3} o=${a:7:3}
echo -e "user:$user\ngroup:$groupe\n"
echo -e "    \t\tread\t\twrite\t\texecute"
uu=${u//[rwx]/"\toui\t"}
echo -e "user\t\c";echo -e ${uu//-/"\tnon\t"}
gg=${g//[rwx]/"\toui\t"}
echo -e "groupe\t\c";echo -e ${gg//-/"\tnon\t"}
oo=${o//[rwx]/"\toui\t"}
echo -e "autres\t\c";echo -e ${oo//-/"\tnon\t"}
lami20j@debian:~/trash$ cat ccm.sh | wc -l
13
lami20j@debian:~/trash$ ls -l fichier
-rwxrw-r-- 1 lami20j lami20j 81 2007-05-15 19:53 fichier
lami20j@debian:~/trash$ sh ccm.sh fichier
user:lami20j
group:lami20j

                read            write           execute
user            oui             oui             oui
groupe          oui             oui             non
autres          oui             non             non
lami20j@debian:~/trash$
lami20j

Répondre à lami20j

11

lami20j, le 16 mai 2007 à 20:03:38

Voilà montre à ton(tes prof) dans 2 lignes :-DDDDDDDDDDDDd

#!/bin/bash
a=$(ls -l $1 | cut -d' ' -f1);user=$(ls -l $1 | cut -d ' ' -f3);groupe=$(ls -l $1 | cut -d ' ' -f4);u=${a:1:3} g=${a:4:3} o=${a:7:3};echo -e "user:$user\ngroup:$groupe\n";echo -e "    \t\tread\t\twrite\t\texecute";uu=${u//[rwx]/"\toui\t"};echo -e "user\t\c";echo -e ${uu//-/"\tnon\t"};gg=${g//[rwx]/"\toui\t"};echo -e "groupe\t\c";echo -e ${gg//-/"\tnon\t"};oo=${o//[rwx]/"\toui\t"};echo -e "autres\t\c";echo -e ${oo//-/"\tnon\t"}

la preuve
lami20j@debian:~/trash$ cat ccm.sh | wc -l
2


P.S. J'espère qu'il n'a pas fixer la longueur de lignes à 1 caractère :-DDD lami20j

Répondre à lami20j

12

yacine, le 16 mai 2007 à 20:21:21

Ouaou bravo !! merci encore , je lui dirai que c est un gros c...
merci

Répondre à yacine

13

lami20j, le 16 mai 2007 à 21:28:54

Bon, en oubliant un peu la demande saugrenue de ton prof, voici une optimisation de ma version, cette fois en 9 lignes et sans rigolade :-))
(je ne compte pas cette fois la ligne #!/bin/bash )

#!/bin/bash
a=$(ls -l $1 | cut -d' ' -f1)
b=${a//[rwx]/"\toui\t"}
aa=${b//-/"\tnon\t"}
user=$(ls -l $1 | cut -d ' ' -f3)
groupe=$(ls -l $1 | cut -d ' ' -f4)
u=${aa:7:21} g=${aa:21:21} o=${aa:42:21}
echo -e "user:$user\ngroup:$groupe\n"
echo -e "    \t\tread\t\twrite\t\texecute"
echo -e "user\t$u\ngroupe\t$g\nautrese\t$o"

lami20j

P.S.
je lui dirai que c est un gros c...

J'ai plaisanté :-))
Peut être il vous pousse un peu pour que vous appreniez mieux
En revanche tu peux le demander pourquoi 16 lignes et pas 15 ou 17 par exemple

Répondre à lami20j

14

yacine, le 16 mai 2007 à 22:01:30

Il veut en moins de 16 lignes pour éviter les if ..then else ...fi à répétition
ensuite je sais pas pourquoi il a choisi ce chiffre , il a du avoir des exemples en 16 lignes avec des if à répétition mais déjà je vois pas comment c'est possible ; j'irai pas le perturber c est déjà assez complexe comme ça ;
a plus ;-))

Répondre à yacine

15

lami20j, le 16 mai 2007 à 22:03:45

D'accord
en final tu peux prendre la version en 9 lignes message N°13 lami20j

Répondre à lami20j

16

farouk, le 3 déc 2007 à 20:20:59

Est ce que vous puvez à trouver un ensemble d'exercices corrigés concernant la programmation en shell sous linux.

Répondre à farouk

17

ibrahim, le 19 jan 2008 à 16:30:30

Slt je voudrais juste un petit script pour faire la fusion de 2 fichiers en un fichier unique

Répondre à ibrahim

18

lami20j, le 19 jan 2008 à 16:42:06

Salut,

pas besoin de script, une commande est suffisante
disons que tu as 2 fichiers : fichier1.txt et fichier2.txt
pour ajouter fichier2.txt à la fin de fichier1.txt
tu tapes

cat fichier2.txt >> fichier1.txt
si tu veux garder les fichier originaux tu peux faire
cat fichier1.txt fichier2.txt > fichier3.txt

lami20j

Répondre à lami20j

19

ibrahim, le 20 jan 2008 à 04:43:38

J'avais cette option mais je pensais kon pouvai le faire aussi a l'aide d'un script. En tout cas merci bc!!!!

Répondre à ibrahim

20

makoko, le 8 fév 2008 à 04:10:43

Bonjour,

J'espère que vous allez bien, dans la nuit !

Jipicy :

Ta solution pour le problème des permissions, fonctionne, comme celui de lami. Merci pour vos solutions!
J'ai choisi ta solution, car plus facile, pour moi, à modifier.

Je veux que le script m'affiche aussi mon nom de login, ce que je n'ai pas !

Modification de script
:

#! /bin/bash

<gras>var=$(ls -l "$1" | cut -d" " -f1)
owner=$(echo "$var" | cut -c2-4)
group=$(echo "$var" | cut -c5-7)
everybody=$(echo "$var" | cut -c8-10)

echo -e "$owner\n$group\n$everybody" > fichier.txt
echo "read write execute"

i=1
while read line
do
if [ "$i" == 1 ]
then param=owner
elif [ "$i" == 2 ]
then param=group
else param=everybody
fi
case "$line" in
---) echo "$paramt non non non"
;;
--x) echo "$param non non oui"
;;
-w-) echo "$param non oui non"
;;
-wx) echo "$param non oui oui"
;;
r--) echo "$param oui non non"
;;
r-x) echo $param oui non oui"
;;
rw-) echo "$param oui oui non"
;;
rwx) echo "$param oui oui oui"
;;
esac
i=$(expr $i + 1)
done < fichier.txt



Résultat
: good (mais manque loginname)

read write execute
owner oui oui non
group oui non non
everybody oui non non


la recherche continue

Merci beaucoup

a+

Répondre à makoko

21

makoko, le 8 fév 2008 à 11:37:45

Bonjour à tous!

J'émerge ....

problème en suspens : afficher mon login, à côté de owner : voir post au dessus.

travail effectué :

J'ai introduit $USER, à côté de, owner, mais le résultat est décevant : owner est soit collé à mon login, si je ne mets pas d'espace entre owner et $USER, ou n'apparait pas s'il y un espace.


contribution bien bienvenue

a+

Répondre à makoko

22

hugnix, le 8 fév 2008 à 14:49:09

Bon je te donne quand même la soluce que j'ai trouvé.

#!/bin/bash
on=$(ls -l $1 | cut -d" " -f3)
gn=$(ls -l $1 | cut -d" " -f4)
gr=$(ls -l $1 | cut -c5)
gw=$(ls -l $1 | cut -c6)
ge=$(ls -l $1 | cut -c7)
er=$(ls -l $1 | cut -c8)
ew=$(ls -l $1 | cut -c9)
ee=$(ls -l $1 | cut -c10)
if [ [ -r $1 ]]
then or="YES"
else or="NO"
fi
if [ [ -w $1 ]]
then ow="YES"
else ow="NO"
fi
if [ [ -x $1 ]]
then oe="YES"
else oe="NO"
fi
if [ [ $gr = "r" ]]
then grr="YES"
else grr="NO"
fi
if [ [$gw = "w" ]]
then grw="YES"
else grw="NO"
fi
if [ [$ge = "x" ]]
then gre="YES"
else gre="NO"
fi
if [ [$er = "r" ]]
then evr="YES"
else evr="NO"
fi
if [ [$ew = "w" ]]
then evw="YES"
else evw="NO"
fi
if [ [$ee = "x" ]]
then eve="YES"
else eve="NO"
fi
echo -e "                               "READ     WRITE   EXECUTE
echo -e OWNER $on"            "$or"   "$ow"   "$oe
echo -e GROUP $gn"                     "$grr"   "$grw"    "$gre
echo -e EVERYBODY"                       "$evr"   "$evw"    "$eve

Bon il est vraiment trop long mais au moins il marche :)))))))
Par contre il y a quelques idées qui commence a me trotter dans la tête, je vais promener ma bête et je me met là dessus.

Répondre à hugnix
Collection CommentÇaMarche.net