Problem solved with a procedure as Rick James has suggested and with Prepared Statements https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html
I put the following code in my script and I execute the source command SOURCE initdb_gestiondesnotes.SQL
After that I call the procedure with: CALL create_professeur();
DELIMITER $$  
CREATE PROCEDURE CREATE_PROFESSEUR()
   BEGIN
      DECLARE v_a INT Default 1 ;
      DECLARE v_nom VARCHAR(42);
      DECLARE v_prenom VARCHAR(42);
      DECLARE v_login VARCHAR(84);
      DECLARE v_titre VARCHAR(5);
      DECLARE v_pwd VARCHAR(5);
      SET v_pwd = 'p';
      simple_loop: LOOP
         SET v_nom = CONCAT("prof", LPAD(CAST(v_a AS CHAR), 3, '0'));
         SET v_prenom = CONCAT("prenom", LPAD(CAST(v_a AS CHAR), 3, '0'));
         SET v_titre = CASE WHEN RAND() > .5
                  THEN 'M'
                  ELSE 'F' END;
         INSERT INTO Professeur (prenom, nom, titre) VALUES (v_prenom, v_nom, v_titre);
         SET v_login = CONCAT(v_prenom, v_nom);
         SET @sql1 = CONCAT('CREATE OR REPLACE USER ', v_login, '@localhost identified BY  \'p\' ');
         PREPARE stm1 FROM @sql1;
         EXECUTE stm1;
         SET @sql2 = CONCAT('GRANT role_professeur TO ', v_login, '@localhost');
         PREPARE stm2 FROM @sql2;
         EXECUTE stm2;
         SET @sql3 = CONCAT('SET DEFAULT ROLE role_professeur FOR ', v_login, '@localhost');
         PREPARE stm3 FROM @sql3;
         EXECUTE stm3;
         SET v_a=v_a+1;
         IF v_a=51 THEN
            LEAVE simple_loop;
         END IF;
   END LOOP simple_loop;
   DEALLOCATE PREPARE stm1;
   DEALLOCATE PREPARE stm2;
   DEALLOCATE PREPARE stm3;      
END $$
DELIMITER ;
Now I hove 50 user with prenom001prof001, prenom002prof002... as login and 'p' as password. Again with prepared statements I gave each user the role of role_professeur.