Appeler un script shell stocké dans un autre script shell variabl

J’ai recherché SO mais je n’ai trouvé aucun article pertinent avec ce problème spécifique. Je voudrais savoir comment appeler un script shell qui est stocké dans une variable d’un autre script shell. Dans le script ci-dessous, j’essaie de lire le nom du service et le script de shell correspondant, vérifiez si le service est en cours d’exécution, sinon démarrez le service à l’aide du script shell associé à ce nom de service. essayé plusieurs options partagées dans divers forums (comme ‘eval’ etc) sans succès. S’il vous plaît aider à fournir vos suggestions à ce sujet.

checker.sh

#!/bin/sh while read service do servicename=`echo $service | cut -d: -f1` servicestartcommand=`echo $service | rev | cut -d: -f1 | rev` if (( $(ps -ef | grep -v grep | grep $servicename | wc -l) > 0 )) then echo "$servicename Running" else echo "!!$servicename!! Not Running, calling $servicestartcommand" eval "$servicestartcommand" fi done < names.txt 

Names.txt

 WebSphere:\opt\software\WebSphere\startServer.sh WebLogic:\opt\software\WebLogic\startWeblogic.sh 

Votre script peut être restructuré en ceci:

 #!/bin/bash while IFS=: read -r servicename servicestartcommand; do if ps cax | grep -q "$servicename"; then echo "$servicename Running" else echo "!!$servicename!! Not Running, calling $servicestartcommand" $servicestartcommand fi done < names.txt 
  • Pas besoin d'utiliser wc -l après la sortie de grep comme vous pouvez utiliser grep -q
  • Pas besoin d'utiliser read full line puis d'utiliser cut , rev etc plus tard. Vous pouvez utiliser IFS=: et lire la ligne en 2 variables distinctes
  • Pas besoin d'utiliser eval à la fin

C’est beaucoup plus simple que prévu. Au lieu de:

  eval "$servicestartcommand" 

eval ne doit être utilisé que dans des circonstances extrêmes. Tout ce dont tu as besoin c’est

  $servicestartcommand 

Note: pas de devis.

Par exemple, essayez ceci sur la ligne de commande:

 cmd='ls -l' $cmd 

Cela devrait fonctionner. Mais:

 "$cmd" 

va échouer. Il cherchera un programme avec un espace dans son nom appelé 'ls -l' .

Peut-être que je ne comprends pas l’idée, mais pourquoi ne pas utiliser les variables du système?

 export FOO=bar echo $FOO 

bar