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