[script shell ] petits scripts

tarikbenn Messages postés 110 Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
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 .. )

6 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
    0
  2. tarikbenn Messages postés 110 Statut Membre 1
     
    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
    0
  3. tarikbenn Messages postés 110 Statut Membre 1
     
    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 :)
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    #!/bin/bash
    
    echo "toto va à l'école?" > fichier


    essaye -ne au lieu de !=

    lami20j
    0
    1. tarikbenn Messages postés 110 Statut Membre 1
       
      #!/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
      0
    2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > tarikbenn Messages postés 110 Statut Membre
       
      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).

      ;-))
      0
    3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      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
      0
    4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > tarikbenn Messages postés 110 Statut Membre
       
      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)).
      ;-))
      0
    5. tarikbenn Messages postés 110 Statut Membre 1 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
       
      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
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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 :-)
    0
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
    0