Rechercher : dans
Par :

[script shell ] petits scripts

Dernière réponse le 28 sep 2006 à 19:13:19 tarikbenn, le 28 sep 2006 à 13:00:19 
 Signaler ce message aux modérateurs

Salut tous le monde



J'ai besoin de faire un script shell qui fait certaines fonctions . Je veux le faire moi même , mais je serai amener à poser des questions ( j'en ai deja une )

Mais je dois faire ce script dans un minimum de temps ( c'est trop urgent : avant la fin de la journée )



Je vous remercie tous pour votre compréhension

et à tout de suite.



Première question : Pourquoi le script suivant m'affiche des erreurs :



#!/usr/bin/ksh
echo "A?"
read A
while [ ! 'a' || ! 'z' ]
do
echo "A?"
read A
done



En gros je veux blinder la saisie , pour que l'utilisateur ne tape que soit a soit z.

les erreurs qu'il m'affiche sont les suivantes :

./test2[4]: test: ] missing
./test2[4]: z: not found

( ou alors , juste comment faire pour qu'il ne les affiche plus ... une option ou .. )

Meilleures réponses pour « [script shell ] petits scripts » dans :
Exécuter un script shell VoirExécution d'un script Pour pouvoir exécuter un script ou un programme en ligne de commande il y a plusieurs possibilités : 1. Le chemin absolu 2. Le chemin relatif 3. Modifier la variable PATH Note: Le Sha-Bang Premièrement,...

1

lami20j, le 28 sep 2006 à 13:12:36

Salut,

en attendant la réponse de jipicy ;)

while [ ! 'a' || ! 'z' ]

tu dois tester le contenu de la variable, et tu ne le fait pas
'a' et 'z' ne sont que des caractères (donc tu testes des constantes)

Tu dois tester si le contenu de la variable et 'a' ou 'z'

A c'est la variable
$A c'est son contenu

je ne suis pas sous linux pour tester. A toi de faire les modifications ;)

lami20j

Répondre à lami20j

2

tarikbenn, le 28 sep 2006 à 13:47:21

Salut Lami20j
J'ai essayé plusieurs syntaxes ( $A != 'a' ...$A ! 'a' ... )
mais aucune ne marche ...
Donc pas de blindage pour le moment ...
Sinon j'ai une deuxieme question :
Comment faire pour creer , dans un script shell , un fichier dans lequel on ecrira "toto va a l'école" ?

Merci d'avance

Répondre à tarikbenn

3

tarikbenn, le 28 sep 2006 à 13:56:41

Le script qui répond à ma première question est le suivant :

#!/usr/bin/ksh
unset A
while $A != 'a' && $A != 'z'
do
echo "A?"
read A
done

Mais je n'ai pas celui qui répond à ma deuxième question :

Comment faire pour creer , dans un script shell , un fichier dans lequel on ecrira "toto va a l'école" ?

Merci d'avance :)

Répondre à tarikbenn

4

lami20j, le 28 sep 2006 à 14:01:55

#!/bin/bash

echo "toto va à l'école?" > fichier


essaye -ne au lieu de !=

lami20j

Répondre à lami20j

6

tarikbenn, le 28 sep 2006 à 15:19:31

#!/bin/bash

echo "toto va à l'école?" > fichier


Cette technique marche , mais elle ne marche plus dès que le nombre de commande augmente. Comment faire par exemple pour envoyer a un fichier :
"titi va a l'ecole"
"toto est a la maison"
"tata ne fait rien"

merci

Répondre à tarikbenn

7

jipicy, le 28 sep 2006 à 15:25:56

Re-

echo "titi va a l'ecole" >> fichier
echo "toto est a la maison" >> fichier
echo "tata ne fait rien" >> fichier

Le double chevron ajoute au fichier (alors que le simple écrase).

;-)) Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

9

jipicy, le 28 sep 2006 à 15:45:02

En shell "ksh" (par rapport au shell bash), tu as aussi la possibilité de mettre un drapeau (noclobber) pour empêcher l'écrasement des fichiers en redirection (extrait du man ksh) :

       > file 
              standard output is redirected to file.  If file does not  exist,
              it  is  created;  if  it  does  exist, is a regular file and the
              noclobber option is set, an error occurs, otherwise the file  is
              truncated.   Note  that  this  means the command cmd < foo > foo
              will open foo for reading and then truncate it when it opens  it
              for writing, before cmd gets a chance to actually read foo.

       >| file
              same  as  >, except the file is truncated, even if the noclobber
              option is set.

       >> file
              same as >, except the file  an  existing  file  is  appended  to
              instead  of being truncated.  Also, the file is opened in append
              mode, so writes always go to the end of the file (see  open(2)).
;-)) Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

8

lami20j, le 28 sep 2006 à 15:43:12

Re,

ou encore

echo -e "titi va a l'ecole\ntoto est a la maison\ntata ne fait rien"  > fichier

Mais garde à l'esprit le double chevron :-)

lami20j

Répondre à lami20j

10

tarikbenn, le 28 sep 2006 à 16:09:42

Merci les gars pour vos réponses !
Il me reste une dernière question avant la fin de la journée :
Comment, a partir d'un script shell, faire pour aller dans un fichier
qui contient les choses suivantes:
titi
toto
tata
titi
toto
tata
titi
aretertertzrgg/
QSdsfdsfqdf/
Qqsdqfdg/


et ajouter a la suite des lignes 8 , 9 et 10 les mots suivants: abc , def et gki.

Merci d'avance

Répondre à tarikbenn

11

jipicy, le 28 sep 2006 à 16:15:27

Ajouter comment ?

Donne un exemple du résultet final s'il te plaît, histoire qu'on soit bien d'accord sur l'interprétation ;-))
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

12

jipicy, le 28 sep 2006 à 16:25:06

Voilà ce que ça pourrait donner, si j'ai bien tout compris ce que tu veux faire :

[jp@MDK tmpfs]$ cat fich.txt

titi
toto
tata
titi
toto
tata
titi
aretertertzrgg/
QSdsfdsfqdf/
Qqsdqfdg/

[jp@MDK tmpfs]$ sed -i.bak '8s/.*/&abc/;9s/.*/&def/;10s/.*/&gkl/' fich.txt

[jp@MDK tmpfs]$ cat fich.txt

titi
toto
tata
titi
toto
tata
titi
aretertertzrgg/abc
QSdsfdsfqdf/def
Qqsdqfdg/gkl

[jp@MDK tmpfs]$
;-) Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

13

tarikbenn, le 28 sep 2006 à 17:17:58

Salut Jipicy
J'espere que t'es encore là
En utilisant ta ligne de commande avec sed ,
j'obtiens l'erreur suivante :
sed: illegal option -- i

Je te donne le script que je lance


#!/usr/bin/ksh
echo "taper le nom "
read NOM
echo "taper la version "
read VERSION
echo "taper la version du machin"
read VERSION_M
sed -i.bak '8s/.*/&${NOM}/;9s/.*/&${VERSION}/;10s/.*/&${VERSION_M}/'/start/test/fichier.conf
cat /start/test/fichier.conf


Mais ca ne marche malheureusement pas.
Please help ;)

Répondre à tarikbenn

14

jipicy, le 28 sep 2006 à 17:25:04

Il faut que la commande sed et le reste de la commande soit sur la même ligne.

Si c'est une question d'esthétisme pour ton script, il faut rajouter un anti-slash avant le retour à la ligne du genre :

sed -i.bak\ '8s/.*/&${NOM}/;9s/.*/&${VERSION}/;10s/.*/&${VERSION_M}/'/start/test/fichier.conf 
;-) Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

15

tarikbenn, le 28 sep 2006 à 17:30:31

Mais c'est sur la même ligne
( c'est juste au niveau du copié collé que ca a découpé la ligne )

Répondre à tarikbenn

16

jipicy, le 28 sep 2006 à 17:39:26

Change les 'quotes simples' par des "quotes doubles" (guillemets), ça devrait aller mieux ;-))

sed -i.bak "8s/.*/&${NOM}/;9s/.*/&${VERSION}/;10s/.*/&${VERSION_M}/" fichier.conf
--
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

17

tarikbenn, le 28 sep 2006 à 17:44:00

Toujours la même erreur... :(

Répondre à tarikbenn

18

jipicy, le 28 sep 2006 à 17:52:28

Pas possible j'ai testé chez moi et ça marche nickel !!!

Colle ton script ici entre lez balises "code" (le dernier bouton à droite là haut dessus quand tu rédiges ton message), qu'on puisse voir où est le 'blème !!!

Au cas ou, il faut un espace à la fin de la commande sed, entre la fin de la commande et le nom du fichier (surtout que tu as un chemin absolu commençant par un slash). Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

19

tarikbenn, le 28 sep 2006 à 18:10:46

Voila le script que j'utilise ( sous Solaris 8 ) :

#!/usr/bin/ksh
echo "taper le nom  "
read NOM
echo "taper la version du produit "
read VERSION
echo "taper la version du ma"
read VERSION_M
sed -i.bak "8s/.*/&${NOM}/;9s/.*/&${VERSION}/;10s/.*/&${VERSION_M}/" /start/test/restore.conf
cat /start/test/restore.conf

Répondre à tarikbenn

20

jipicy, le 28 sep 2006 à 18:22:53

Ben je comprends toujours pas !!!
Un copier/coller de ton script chez moi (j'ai juste changé le nom du fichier à modifier en "fichier.txt") et tout baigne...

[jp@MDK tmpfs]$ cat fichier.txt

titi
toto
tata
titi
toto
tata
titi
aretertertzrgg/
QSdsfdsfqdf/
Qqsdqfdg/

[jp@MDK tmpfs]$ ksh tarikbenn.sh

taper le nom
jipicy
taper la version du produit
1er du nom
taper la version du ma
CCM

titi
toto
tata
titi
toto
tata
titi
aretertertzrgg/jipicy
QSdsfdsfqdf/1er du nom
Qqsdqfdg/CCM

[jp@MDK tmpfs]$ 
J'comprends pô ;-\

Mais au fait c'est quoi l'erreur chez toi ?
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

21

tarikbenn, le 28 sep 2006 à 18:29:49

Bein oui :/
c vraiment bizarre
l'erreur que je recois est la suivante :

sed: illegal option -- i


voila , j'espere que ca t'aidera à debugger ;)

Répondre à tarikbenn

22

jipicy, le 28 sep 2006 à 18:48:22

Apparemment ta version de sed (aficche la d'ailleurs : sed --version) ne prend pas en compte le paramètre "-i" !!!

Dans ce cas là, essaie dans un premier temps de faire juste l'affichage sur la sortie standard (l'écran) et si y'a pas d'erreur, il faudra alors passer par un fichier temporaire.
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

5

jipicy, le 28 sep 2006 à 14:07:27

Salut,

J'étais en train de faire les tests et j'ai pondu le même script que le tien à quelques crochets prés ;-))

echo "A?"
read A
while [ "$A" != "a" ] && [ "$A" != "z" ]
do
	echo "A?"
	read A
done
Voilou :-) Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

23

 lami20j, le 28 sep 2006 à 19:13:19

Re,

et si tu remplaces la ligne avec sed avec une ligne avec perl?!

$ cat tarikkben.txt
titi
toto
tata
titi
toto
tata
titi
aretertertzrgg/
QSdsfdsfqdf/
Qqsdqfdg/
$ perl -pi.bak -e '8..8?s/(.*)/$1abc/:9..9?s/(.*)/$1def/:10..10?s/(.*)/$1ghi/:­s/(.*)/$1/' tarikkben.txt
$ cat tarikkben.txt
titi
toto
tata
titi
toto
tata
titi
aretertertzrgg/abc
QSdsfdsfqdf/def
Qqsdqfdg/ghi
lami20j@debian:~/trash$
lami20j

Répondre à lami20j