[script shell ] petits scripts

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. Modérateur
    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
    1. Modérateur
      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 :-)
      1. Modérateur
        #!/bin/bash
        
        echo "toto va à l'école?" > fichier


        essaye -ne au lieu de !=

        lami20j
        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
        2. Modérateur
          @tarikbennRe-

          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).

          ;-))
        3. Modérateur
          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
        4. Modérateur
          @tarikbennEn 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)).
          ;-))
        5. @lami20jMerci 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
      2. 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 :)
        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
          1. Modérateur
            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