Probleme script simple

Résolu
maxibgoode Messages postés 436 Date d'inscription   Statut Membre Dernière intervention   -  
maxibgoode Messages postés 436 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Mon script ne marche pas :,(

Je voulais faire un script qui propose de mette les directives préprocesseur et le main dans des fichiers .h/.c/.cpp.

Pour les .h ça marche bien que petit soucis : le echo -e "blabla" affichera -e blabla dans le fichier!!

Pour les autres il y a un soucis au niveau de mes conditionnelles et boucles while mais je n'arrive pas à les corriger : j'ai des trucs du genre
./monScript.sh: line 24: [: !=: unary operator expected

Merci de bien vouloir m'aider.

Voici le script :

#!/bin/sh

#Saisie du nom du fichier
echo "Saisir le nom de votre fichier"
read nomFichier

case $nomFichier in
#Cas d'un fichier .h : inclusion des directives préprocesseur conditionnelles
*.h)

include=`echo $nomFichier | tr [:lower:] [:upper:]`
echo "#ifndef_$include" >> $nomFichier
echo "#define_$include" >> $nomFichier
echo -e "\n\n#endif" >> $nomFichier
echo "Directive préprocesseur incluses"
exit 0
;;

#Cas d'un fichier .c : demande d'inclusion de stdio, stdlib et unistd puis mise en place du main
*.c)

#STDIO
echo "Inclure stdio? (y/n)"
while [ $repio != 'y' ] || [ $repio != 'n' ]
do
read repio
done

if [ $repio = 'y' ]
then
echo "#include <stdio.h>" >> $nomFichier
echo "stdio.h a été inclu"
clear
fi

#STDLIB
echo "Inclure stdlib? (y/n)"
while [ $repLib != 'y' ] || [ $repLib != 'n' ]
do
read repLib
done

if [ $repLib = 'y' ]
then
echo "#include <stdlib.h>" >> $nomFichier
echo "stdlib.h a été inclu"
clear
fi

#UNISTD
echo "Inclure unistd? (y/n)"
while [ $repUni != 'y' ] || [ $repUni != 'n' ]
do
read repUni
done

if [ $repUni = 'y' ]
then
echo "#include <unistd.h>" >> $nomFichier
echo "unistd a été inclu"
clear
fi

#MAIN
echo "Inclure un main? (y/n)"
while [ $repM != 'y' ] || [ $repM != 'n' ]
do
read repM
done
if [ $repM = 'y' ]
then
echo -e "\n\nint main (int argc, char *argv[])" >> $nomFichier
echo -e "{\n\nreturn 0;\n}\n" >> $nomFichier
echo "$nomFichier contient un main"
clear
fi
exit 0

;;
#Cas d'un fichier .cpp : inclusion de iostream, string, utilisation du namespace et inclusion du main
*.cpp)

#IOSTREAM
echo "Inclure iostream? (y/n)"
while [ $repio != 'y' ] || [ $repio != 'n' ]
do
read repio
done

if [ $repio = 'y' ]
then
echo "#include <iostream>" >> $nomFichier
echo "iostream a été inclu"
clear
fi

#STRING
echo "Inclure string? (y/n)"
while [ $repStr != 'y' ] || [ $repStr != 'n' ]
do
read repStr
done

if [ $repStr = 'y' ]
then
echo "#include <string>" >> $nomFichier
echo "string a été inclu"
clear
fi

#NAMESPACE
echo "Utiliser le namespace std (y/n)"
while [ $repName != 'y' ] || [ $repName != 'n' ]
do
read repName
done
if [$repName = 'y']
then
echo -e "\nusing namespace std;" >> $nomFichier
echo "$nomFichier utilise le namespace std"
clear
fi

#MAIN
echo "Inclure un main? (y/n)"
while [ $repM != 'y' ] || [ $repM != 'n' ]
do
read repM
done
if [ $repM = 'y' ]
then
echo -e "\n\nint main (int argc, char *argv[])" >> $nomFichier
echo -e "{\n\nreturn 0;\n}\n" >> $nomFichier
echo "$nomFichier contient un main"
fi

exit 0

;;
#Défaut
*)
echo "Rien à faire."
exit 0
;;
esac
Configuration: Macbook unibody // iMac 27"
Mac OS X Sow Leopard

5 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Remplace plutôt tes tests par (exemple sur ton 1er test (#STDIO) à appliquer à tous les autres...) :

    #STDIO
    
    while :
    do
    read -p "Inclure stdio? (y/n) " repio
    case "$repio" in
    y|n)	if [ "$repio" = 'y' ]
    	then
    	echo "#include <stdio.h>" >> $nomFichier
    	echo "stdio.h a été inclu"
    	sleep 2
    	clear
    	break
    	else 
    	echo "rien à faire..."
    	break
    	fi
    	;;
    *)	echo "Mauvais choix ! Recommencez s'il vous plaît."
    	continue
    	;;
    esac
    done

    0
  2. maxibgoode Messages postés 436 Date d'inscription   Statut Membre Dernière intervention   76
     
    Merci je vais essayer.
    Mais je ne comprends pas le while :
    Est-ce que ça veut dire qu'il recommence tant que c'est le cas général?
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Le "while :" peut aussi s'écrire "while true", donc tant que la condition est vraie, faire...

      Pour en sortir on met un "break" (cas du "y|n"), et pour recommencer on met un "continue" (cas du "*").
      0
  3. maxibgoode Messages postés 436 Date d'inscription   Statut Membre Dernière intervention   76
     
    très bien en fait j'avais compris en tentant de réécrire ce que tu m'as donné.
    Et as-tu une explication concernant le
    echo -e "\n\n#endif" >> $nomFichier
    qui va m'afficher le -e??
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Pas vraiment non ;-(

      A tout hasard, essaie avec "/bin/echo -e"
      0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Et as-tu une explication concernant le
    echo -e "\n\n#endif" >> $nomFichier
    qui va m'afficher le -e??


    Côté shell il va ajouter à la fin de fichier deux sauts de lignes et ensuite #endif
    ~$ echo -e "\n\n#endif"
    
    
    #endif
    


    Côté C il s'agit de la fin de l'inclusion conditionnelle #ifndef

    Par exemple pour s'assurer qu'un fichier d'en-tête n'est inclus qu'une seule fois

    #ifndef HEADERS
      #define HEADERS "headers.h"
    #endif
    #include HEADERS


    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. maxibgoode Messages postés 436 Date d'inscription   Statut Membre Dernière intervention   76
     
    En fait hors du script il faut que je mette le -e tandis que dans le script je peux le retirer il prendra les saut de ligne quand même.
    Merci en tout cas pour m'avoir aidé à résoudre mes problèmes de boucles.
    Cordialement.
    0