Afficher le contenu d'une variable contenue dans une autre var

[Résolu/Fermé]
Signaler
Messages postés
6
Date d'inscription
mercredi 3 février 2016
Statut
Membre
Dernière intervention
4 février 2016
-
Messages postés
6
Date d'inscription
mercredi 3 février 2016
Statut
Membre
Dernière intervention
4 février 2016
-
Bonjour à tous,

J'ai un problème en voulant développer un script SHELL.

Je récupère dans un fichier des noms de script à exécuter.
Or le fichier est de cette forme :

MonFic.txt :
$MonDossierKSH/script1.ksh
$MonDossierKSH/script2.ksh
$MonDossierSH/script1.sh



Du coup, quand je récupère la ligne dans un variable, je ne peux pas afficher le chemin complet du script puisque il ne prend pas la valeur $MonDossierKSH comme une variable.

Exemple de script :

#!/bin/ksh

$MonDossierKSH=/appli/projects/MonAppli/KSH
$MonDossierSH=/appli/projects/MonAppli/SH

while IFS=" " read script
do
	echo $script
done < MonFic.txt


Le résultat :
$MonDossierKSH/script1.ksh
$MonDossierKSH/script2.ksh
$MonDossierSH/script1.sh


Or j'aimerais avoir :
/appli/projects/MonAppli/KSH/script1.ksh
/appli/projects/MonAppli/KSH/script2.ksh
/appli/projects/MonAppli/SH/script1.sh



Est ce possible ?

Merci pour votre retour :)

1 réponse

Salut,
Est ce possible ?
Dans l'état actuel, non :-(

Comment veux-tu que ton script devine ce que contient $MonDossierSH si cette variable n'est déclarée nulle part ?

Déjà, comme elle atterrit (sous cette forme) dans ton fichier MonFic.txt ?
Messages postés
6
Date d'inscription
mercredi 3 février 2016
Statut
Membre
Dernière intervention
4 février 2016
>
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021

Voici le code :

#Récupère seulement les taches
grep "^[0-9]\|^\*" $ficCrontab > $ficCrontab_OnlyTask

#Boucle pour analyser chaque tache
while IFS=" " read minuteCron heureCron jourMoisCron moisCron jourSemaineCron tache reste
do
	fc_analyse_crontab #Analyse pour savoir si la tache est à rejouer
	jobActif=$?
	if [[ $jobActif -eq 0 ]]
	then
		echo -e "$tache \n" >> monFic.txt
	fi
done < $ficCrontab_OnlyTask

Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 417
Une solution parmi d'autres…

Tu extrait les variables de ta crontab que tu envoies dans un fichier temporaire, puis tu sources ce fichier :

Le fichier mon_fich (copie de ta crontab) :
$ cat mon_fich 
#############################################
##### Declaration des variables #####
#############################################
MonDossierKSH=/appli/projects/MonAppli/KSH
MonDossierSH=/appli/projects/MonAppli/SH

#Mes scripts
20 09 * * * $MonDossierKSH/script1.ksh
30 09 * * * $MonDossierKSH/script2.ksh


Le script :
$ cat foo.sh 
#! /bin/bash

grep '^[[:alpha:]]' mon_fich > tmp_fich
source tmp_fich

echo "MonDossierKSH = $MonDossierKSH"
echo "MonDossierSH = $MonDossierSH"

echo "Et voila ;-))"


L'exécution :
$ ./foo.sh 
MonDossierKSH = /appli/projects/MonAppli/KSH
MonDossierSH = /appli/projects/MonAppli/SH
Et voila ;-))
Messages postés
6
Date d'inscription
mercredi 3 février 2016
Statut
Membre
Dernière intervention
4 février 2016
>
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021

Merci pour ta réponse, mais ce n'est pas mon problème :S

Je reprends :

J'ai mon fichier mon_fich (copie de ma crontab) :
$ cat mon_fich
#############################################
#####     Declaration des variables     #####
#############################################
MonDossierKSH=/appli/projects/MonAppli/KSH
MonDossierSH=/appli/projects/MonAppli/SH

#Mes scripts
20 09 * * * $MonDossierKSH/script1.ksh
30 09 * * * $MonDossierKSH/script2.ksh


Le script :
$ cat foo.sh
#! /bin/bash

grep '^[[:alpha:]]' mon_fich > tmp_fich
source tmp_fich

echo "MonDossierKSH = $MonDossierKSH"
echo "MonDossierSH = $MonDossierSH"

echo "Et voila ;-))"


echo -e "\nResultat obtenu"
#Recupere seulement les taches
grep "^[0-9]\|^\*" mon_fich > mon_fic_OnlyTask

#Boucle pour analyser chaque tache
while IFS=" " read minuteCron heureCron jourMoisCron moisCron jourSemaineCron tache reste
do
        echo -e "$tache"
done < mon_fic_OnlyTask



Résultat :
$ ./foo.sh
MonDossierKSH = /appli/projects/MonAppli/KSH
MonDossierSH = /appli/projects/MonAppli/SH
Et voila ;-))

Resultat obtenu
$MonDossierKSH/script1.ksh
$MonDossierKSH/script2.ksh



Mais ce n'est pas le résultat que j'attends. J'aimerais voir afficher :
$ ./foo.sh
MonDossierKSH = /appli/projects/MonAppli/KSH
MonDossierSH = /appli/projects/MonAppli/SH
Et voila ;-))

Resultat obtenu
/appli/projects/MonAppli/KSH/script1.ksh
/appli/projects/MonAppli/KSH/script2.ksh



Après, je pourrais faire le changement manuellement (à coup de sed, cut..), mais c'est galère et vraiment pas propre.
>
Messages postés
6
Date d'inscription
mercredi 3 février 2016
Statut
Membre
Dernière intervention
4 février 2016

Salut,

Essaie avec ça :

#! /bin/bash

grep '^[[:alpha:]]' mon_fich > tmp_fich
source tmp_fich

echo "MonDossierKSH = ${MonDossierKSH}"
echo "MonDossierSH = ${MonDossierSH}"

echo "Et voila ;-))"


echo -e "\nResultat obtenu"
#Recupere seulement les taches
grep -Po '^([0-9]|\*).*\K\$.*' mon_fich > mon_fic_OnlyTask

#Boucle pour analyser chaque tache
while read tache
do

eval 'echo "'"${tache}"'"'

done < mon_fic_OnlyTask


Voila ce que ça donne chez moi :
$ ./foo.sh
MonDossierKSH = /appli/projects/MonAppli/KSH
MonDossierSH = /appli/projects/MonAppli/SH
Et voila ;-))

Resultat obtenu
/appli/projects/MonAppli/KSH/script1.ksh
/appli/projects/MonAppli/KSH/script2.ksh
Messages postés
6
Date d'inscription
mercredi 3 février 2016
Statut
Membre
Dernière intervention
4 février 2016
> UnGars
Yeeaaaah :D

Ca fonctionne très bien.

Merci pour vos réponses.

Bonne journée.