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
wc -l
après la sortie de grep
comme vous pouvez utiliser grep -q
cut
, rev
etc plus tard. Vous pouvez utiliser IFS=:
et lire la ligne en 2 variables distinctes 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