Iam, le script du développeur

Bonjour.

Je me suis écrit un script de managment pour un accès rapide à mes projets.
C’est un script relativement simple faisant appel à la commande 'name à laquelle on passe la longueur de la chaîne grâce à la commande ‹ random › pour générer un nom et qui lit la liste des projets dans un répertoire « Projects »

Ici on appelle computerman version 5 qui démarre automatiquement en mode Manager et on peut remplacer ces appel par emacs.

Voici le script :

#!/bin/bash
declare Response=;
declare Name=;
if [ ! -d Projects ]; then
    mkdir Projects ;
fi;
declare -a Projects=(`ls Projects`) ;
declare Max="`ls Projects | cat -n | tail -1 | awk '{print $1}'`";
declare Min="0";
declare Exist="False";
declare Index=0 ;
let Max=Max-1;
echo "create and maintain your projects ;"
echo "iam version 1"
date
echo "enter the name of project or"
echo "try 'no' to skip or"
echo "try 'yes' for to create project."
echo "try 'exit' to quit."
while (true) do
      #echo ${Projects[@]} ;
      #echo "Max=$Max" ;
      #echo "Min=$Min" ;
      #if [ ! $Max == 0 ]; then
      for I in $(seq 0 $Max); do
	  echo ${Projects[$I]} ;
      done;
      #fi;
      declare Count=`random` ;
      Name=`name $Count`;
      
      echo "am i $Name?" ;
      read Response ;
      if [ \"$Response\" = "\"yes\"" ]; then
	  echo "yes!" ;
	  mkdir Projects/$Name ;
	  
	  declare -a Projects=(${Projects[@]} $Name) ;
	  cd Projects/$Name ;
	  tar -x -v -f computerman-18.1.5b.tar
	  make -C computerman-18.1.5b head tail clean mrproper all
	  cp computerman-18.1.5b/bin/cpu ~/bin
	  ./computerman-18.1.5b/bin/computerman
	  cd ..
	  cd ..
      elif [ \"$Response\" = "\"exit\"" ]; then
	  break ;
      else
	  for J in $(seq 0 $Max); do
	      echo ${Projects[$J]} ;
	      if [ ${Projects[$J]} = $Response ]; then
		  declare Exist="True" ;
	      else
		  declare Exist="False" ;
	      fi;	      
	  done;
	  if [ $Exist = "True" ]; then
	      cd Projects/$Response ;
	      ./computerman-18.1.5b/bin/computerman
	      cd ..
	      cd ..
	  elif [ \"$Response\" = "\"\"" ]; then
	      echo ""
	  elif [ \"$Response\" = "\"no\"" ]; then
	      echo ""
	  else
	      mkdir Projects/$Response ;
	      
	      declare -a Projects=(${Projects[@]} $Response);
	      
	      cd Projects/$Response ;
	      tar -x -v -f ../../computerman-18.1.5b.tar
	      make -C computerman-18.1.5b head tail clean mrproper all
	      cp computerman-18.1.5b/bin/cpu ~/bin
	      ./computerman-18.1.5b/bin/computerman
	      cd ..
	      cd ..
	  fi;
      fi;
      declare -a Projects=(`ls Projects`) ;
      declare Max="`ls Projects | cat -n | tail -1 | awk '{print $1}'`";
      let Max=Max-1;
done;

A chaque tour de boucle on affiche la liste des projet est on attends la réponse.

1 J'aime

Bonjour,
Quel est le besoin fonctionnel initial?
Quels types de projets?

utiliser git? ou svn? Gérer les projets avec Eclipses ? etc…

Bonjour Zargos.

Pour répondre à tes integrrogations, le besoin initial est d’être performant.
Pour ce qui est des projets, je penses que c’est une idée logicielle.
Cependant le manager de computerman ne gère que les projet Ada.

Alors réinventer la roue, c’est contre-productif.
Les outils comme git, svn, etc… se moquent du langage utilisé.
Et Eclipse est capable de gérer des projets ADA (et d’utiliser git et svn pour le versionning en prime, et quelques autres).

Woais mais ici je parle pas d’un manager.

Et ben tu remplace « computerman » par git.

Donc c’est bien ce que je dit, une réinvention de roues existantes.

J’aime bien réinventer des roues… Ça me permet de mieux comprendre comment d’autres ont fait la première invention, et à quel point j’ai pu me fourvoyer et faire des âneries, en sortant des roues hexagonales ou dont l’axe est tordu. Et j’apprends.

Plus sérieusement: je ne connaissais pas cette syntaxe:

Et la page de man ne m’a pas trop aidé (PostgreSQL…); de toute évidence, ça fabrique une variable. Mais en quoi cette syntaxe serait-elle préférable à une déclaration plus « classique », comme:

trou="2mon"

?

Même question pour let:

let Max=Max-1;

à comparer à:

Max=$(( $Max - 1 ))

?

Quels sont les avantages (ne pas taper de $ (anticapitalisme?..), ne pas taper de parenthèses (et avoir l’air (un peu) moins Lispeux)) et inconvénients des deux approches?

Tout à fait d’accord ! On voit ce que donne actuellement la « productivité » avec les mauvais résultats économiques. La réelle productivité existe lorsqu’on laisse le temps au cerveau de comprendre et de réfléchir. De plus, chercher à comprendre, réfléchir, développe et entretien les réseaux neuronaux, retarde le vieillissement, accentue la motivation, et améliore la créativité. Trop de connaissances sont superficielles à cause d’un manque de temps laissé aux apprenants ou aux développeurs. Ceci dit, il est intéressant de se pencher sur les outils de productivité mais ne pas en abuser au risque d’effet contraire !

Enfin @pichux , le choix des variables doit être approprié et ne pas appartenir au registre de la vulgarité. Je vous invite à éditer votre post précédent pour le corriger en conséquence.

1 J'aime

Pour répondre aux différentes syntaxes (2mn sur google ou autre):

  • $((…)) est appelé expansion arithmétique, ce qui est typique des shells bash et ksh. Cela permet de faire de l’arithmétique simple en nombre entier, mais pas de calcul à virgule flottante. Le résultat de l’expression remplace l’expression, comme dans echo $((1+1)) deviendrait echo 2
  • ((…)) est appelé évaluation arithmétique et peut être utilisé dans le cadre de si ((…)); puis ou pendant que ((…)); faire des déclarations. L’expansion arithmétique $((…)) remplace la sortie de l’opération et peut être utilisée pour assigner des variables comme dans i=$((i+1)) mais ne peut pas être utilisée dans les instructions conditionnelles.
  • $[…] est l’ancienne syntaxe pour l’expansion arithmétique qui est déconseillée. Voir aussi. Ceci a probablement été gardé pour que les anciens scripts bash ne se cassent pas. Cela n’a pas fonctionné dans ksh93, donc je suppose que cette syntaxe est spécifique à bash. REMARQUE : les espaces sont très importants ici; ne confondez pas $[1+1] avec des choses comme [ $a -eq $b]. La commande [ avec des espaces est connue sous le nom de commande de test, et vous la voyez généralement dans les parties de prise de décision. Il est très différent dans le comportement et le but.
  • let est un mot-clé bash et ksh qui permet la création de variables avec une évaluation arithmétique simple. Si vous essayez d’assigner une chaîne comme let a=« hello world » vous obtiendrez une erreur de syntaxe. Fonctionne dans bash et ksh93.
  • $(…) est une substitution de commande, où vous prenez littéralement la sortie d’une commande et l’assignez à une variable. Votre commande ici est expr, qui prend des arguments positionnels, comme expr arg1 arg2 arg3, donc les espaces sont importants. C’est un peu comme une petite calculatrice en ligne de commande pour l’arithmétique des nombres entiers, plus certains types de vrai/faux et de regex. Ceci est une commande shell-neutre.
1 J'aime

Bonjour,

Je vois pas la pertinence de vos objections.
Ce script fonctionne très bien.

1 J'aime

Merci bien, mais ceci ne répond point à mon questionnement concernant l’intérêt ou pas d’avoir recours à l’instruction declare.

Ah, mais je n’ai aucune objection, bien au contraire!

C’est chouette, un script qui marche, bravo.

declare ne sert à rien excepté si tu veux que la variable soit déclarée avec un type.

une déclaration implicite est suffisante dans la plupart des cas:

mavar="du texte"

Mais su tu veux un variable integer:

declare -i iVar

ou la declarer en array:
Indexée

declare -a aVar

associatif

declare -A aVar

etc…

Ce qui fait que dans ton script:

declare variable=

Ca ne sert à rien.

Après pour imprimer la variable Projects, je pense que tu peux te passer d’une boucle avec:

printf '%s\n' "${Projects[ @]}"

Le point-virgule à la fin ne sert à rien. Il n’est utilisé que si tu met une autre commande derrière avec un espace après le point-virgule.

Pour calculer Max:

Max=${#Projects[@]}

je ne connais pas les fonction name et random qui ne sont pas des fonctions de base de Bash.

Pourquoi les \ pour Response et yes ? il suffit de mettre:

if [ "$Response" = "yes" ]; then

le declare est de trop , et même il suffit de faire:

Project=+("$Name")

Plutot que de faire des if then elif pour traiter les cas à Response, tu devrai plutôt utiliser case esac

utiliser un Max calculé,peut être remplacé directement par une boucle while si ton tableau a au moins un élément:

while red -r _response
do
	      echo $_response ;
	      if [ "$_response" = $Response ]; then
		  declare Exist="True" ;
	      else
		  declare Exist="False" ;
	      fi;
done <<< "${Projects[@]}"

Ceci dit, le dernier élément a toujours raison, c’est lui qui détermine la suite. de fait, si le dernier donne Exist=false, quelques soient les autres résultats précédent, Exist ne pourra jamais être à True

1 J'aime