Probleme script simple

Résolu
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. 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.
    1. Modérateur
      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


      1. 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??
        1. Modérateur
          Pas vraiment non ;-(

          A tout hasard, essaie avec "/bin/echo -e"
      2. 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?
        1. Modérateur
          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 "*").
      3. Modérateur
        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