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

    1. 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 "*").
    2. 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"
    3. 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. 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.