2011-03-11 6 views
0

J'ai un script shell comme celui-ci.erreur de script shell

line="[email protected]" # get the complete first line which is the complete script path 
name_of_file = ${line%.*} 
file_extension = ${line##*.} 
if [ $file_extension == "php"] 
then 
ps aux | grep -v grep | grep -q "$line" || (nohup php -f "$line" > /var/log/iphorex/$name_of_file.log &) 
fi 
if [ $file_extension == "java"] 
then 
ps aux | grep -v grep | grep -q "$line" || (nohup java -f "$name_of_file" > /var/log/iphorex/$name_of_file.log &) 
fi 

ici variable ligne a des valeurs comme /var/www/dir/myphp.php ou /var/www/dir/myjava.java.

Le but du script shell est de vérifier si ces processus sont déjà en cours d'exécution et sinon j'essaie de les exécuter.J'ai les erreurs suivantes.

name_of_file: command not found 
file_extension: command not found 
[: missing `]' 
[: missing `]' 

Des idées?

+0

Pour les questions de support dont vous avez besoin d'espace entre la citation à proximité ' "' et le crochet de fermeture ']' comme le suivant ... '" php "]' –

+0

Quel shell? Le script commence par un '#! '? – nmichaels

+0

puis-je obtenir 'nom_du_fichier: command not found file_extension: command not found [: ==: opérateur unaire attendu [: ==: opérateur unaire expected' – ayush

Répondre

3

Tout d'abord, le processeur shell traite la ligne:

name_of_file = ${line%.*} 

comme exécu tion de la commande:

name_of_file 

avec les paramètres:

= ${line%.*} 

vous devez écrire comme:

name_of_file=${line%.*} 

Cela rend dans une variable = valeur. Vous devez répéter ceci pour la file_extension = line aussi.

En second lieu, le cas:

if [ $file_extension == "php"] 

a exactement le même problème d'analyse syntaxique, vous doit avoir un espace avant le trailing], parce que sinon l'analyseur pense que vous êtes vérifier si file_extension $ est égal à la chaîne: « php] »

if [ $file_extension == "php" ] 
1

supprimer les espaces d'abord, peut-être cela vous aidera ...

name_of_file=${line%.*} 
file_extension=${line##*.} 

EDIT
Essayez ceci:

if [ $file_extension="php" ] 
.. 
if [ $file_extension="java" ] 
+0

aucune aide 'name_of_file: commande introuvable infinity.sh: ligne 8: extension_fichier: commande introuvable infinity.sh: ligne 9: [: ==: opérateur unaire attendu infinity.sh: ligne 13: [: ==: opérateur unaire attendu 'J'ai eu cette erreur – ayush

1

les other answers ont raison que le problème dans votre script réside dans des espaces parasites dans vos affectations de variables et [ .. ] déclarations.

(hors-sujet. Pour votre information)

Je pris la liberté de refactorisation votre script (non testé!) Vient de mettre en évidence certaines alternatives, à savoir:

  • à l'aide pgrep au lieu de ps aux | grep .....
  • utilisant case

-

#!/bin/bash 
line="[email protected]" # get the complete first line which is the complete script path 
name_of_file=${line%.*} 

pgrep "$line" > /dev/null && exit # exit if process running 

case "${line##*.}" in # check file extension 
    php) 
     nohup php -f "$line" > /var/log/iphorex/$name_of_file.log & 
     ;; 
    java) 
     nohup java -f "$name_of_file" > /var/log/iphorex/$name_of_file.log & 
     ;; 
esac 
+0

@Chin: merci pour les trucs supplémentaires..semble plus propre de cette façon :) – ayush

+0

De rien. –