2011-01-06 9 views
4

Je vais chercher à la viande et les os:utilisation variable de script shell

MY_VAR=6 
until [$MY_VAR = 0] 
do 
dir/dir_$MY_VAR.log 
ps | grep "NAME_$MY_VAR.ksh" 
check some things 
if [results = ok] 
echo "program $MY_VAR sucessful" 
else 
echo "program $MY_VAR failure" 
MY_VAR = `expr $MY_VAR - 1` 
done 

Maintenant, je reçois les erreurs suivantes my_Var pas trouvé et [6: Introuvable, donc je suppose plutôt une erreur noobish . Je pense que la logique est assez juste une simple erreur de syntaxe que je fais quelque part par l'apparence des deux erreurs, je pense que cela pourrait être dans la déclaration.

Répondre

3

Vous devez avoir un espace après [ et avant ] puisque [ est en fait une commande et non un délimiteur.

Voici votre script réécrite dans Bash (ou ksh):

my_var=6 
until ((my_var == 0)) 
do 
    dir/dir_$my_var.log # I have no idea what this is supposed to be 
    ps | grep "NAME_$my_var.ksh" 
    # check some things 
    if [[ $results = ok ]] 
    then 
     echo "program $my_var successful" 
    else 
     echo "program $my_var failure" 
     ((my_var--)) 
    fi 
done 

Cependant:

for my_var in {6..1} 
do 
    dir/dir_$my_var.log # I have no idea what this is supposed to be 
    ps | grep "NAME_$my_var.ksh" 
    # check some things 
    if [[ $results = ok ]] 
    then 
     echo "program $my_var successful" 
    else 
     echo "program $my_var failure" 
    fi 
done 
+0

Je reçois l'erreur MY_VAR--: plus de jetons attendus, pourriez-vous élaborer sur votre solution comme l'utilisation de (()) et [[]] – Jewsef

+0

@Jewsef: Utilisation de quel shell et sur quelle ligne de quelle version de les scripts de ma réponse? Une chose à noter, j'avais changé le cas du nom de la variable, mais je l'ai fait de manière incohérente. Cela a peut-être causé quelques problèmes. Désolé à ce sujet - je l'ai réparé. Dans les doubles crochets Bash et ksh [activer des fonctionnalités supplémentaires] (http://mywiki.wooledge.org/BashFAQ/031). L'utilisation de doubles parenthèses pour les comparaisons numériques vous permet d'utiliser '==' et '>', par exemple, au lieu des '-eq' et' -gt'. Il vous permet également de faire des opérations arithmétiques telles que le décrément '((my_var -))' montré. –

+0

@Jewsef: Je viens de remarquer que le script de votre question manque le 'fi' pour fermer le' if'. J'ai copié votre script dans ma réponse et raté la correction (maintenant corrigé). Cela pourrait être la source de votre erreur. –

0

Vos deux erreurs sont causées par:

  • until [$MY_VAR = 0]
  • MY_VAR = $(expr $MY_VAR - 1)

[J'ai utilisé $() au lieu de contre-apostrophes parce que je ne pouvais pas obtenir dans la section des accents graves de code]

Le premier problème est le manque d'espaces autour des crochets - sur les deux extrémités. Le shell recherche la commande [6 (après l'extension $MY_VAR), au lieu de [ (jetez un oeil à /usr/bin/[ - c'est en fait un programme). Vous devez également utiliser -eq pour effectuer des comparaisons numériques. = devrait fonctionner ok, mais des zéros à gauche peut briser une comparaison de chaîne où une comparaison numérique fonctionnerait:

until [ "$MY_VAR" -eq 0 ] 

Le deuxième problème est que vous avez des espaces dans votre affectation de variables. Lorsque vous écrivez MY_VAR = ..., le shell recherche la commande MY_VAR. écrire à la place comme:

MY_VAR=`expr $MY_VAR - 1` 

Ces réponses répondent directement à vos questions, mais vous devez étudier la réponse de Dennis Williamson de meilleures façons de faire ces choses.

+0

Il est vrai que '' '' existe en tant que '/ usr/bin/[', mais c'est aussi un shell intégré, et en tant que tel a la priorité. Méfiez-vous du comportement du zéro initial, '[008 -eq 8]' fonctionne, mais '[[008 -eq 8]]' donne une valeur 'trop bonne pour l'erreur de base'. Les backticks doivent être évités de toute façon, l'utilisation de '$()' est préférable. –

Questions connexes