2012-09-15 7 views
2

J'ai hérité d'un script bash (ce n'est pas un héritage merveilleux!) Et j'essaie de comprendre ce qui ne va pas.mauvaise substitution dans un script bash

La ligne incriminée est la suivante: while [ "${\(\#\)}" -gt 0 ] ; do

et je reçois un message d'erreur « mauvaise substitution » lorsque je tente de l'exécuter. Je suis à peu près sûr qu'il essaie de demander si le nombre d'args est supérieur à zéro, mais vous le savez aussi.

Je ne sais pas si cela a déjà fonctionné. J'imagine qu'il n'y a pas assez de barres obliques inverses, ou peut-être trop, ou peut-être que les parenthèses n'appartiennent pas à cet endroit. J'ai essayé plusieurs d'entre eux, mais pas de chance.

Tout éclaircissement apprécié.

+0

J'ai négligé le peu de "pas assez d'antislashs" quand j'ai répondu. Y a-t-il des backslashes dans le script près de la ligne while? Si un script écrit un script dans un autre fichier, il peut utiliser \ $ # pour retarder l'évaluation de $ #. –

+0

lorsqu'il s'agit de code hérité comme ceci toujours supposer que cela a fonctionné à un moment donné. Je vérifierais vos paramètres d'entrée pour la validité. –

Répondre

2

Bien que la ligne d'origine génère le message d'erreur que vous avez mentionné (Substitution incorrecte), il suffit de supprimer les parenthèses pour résoudre le problème. Par exemple, avec les éléments suivants dans le fichier while-num

#!/bin/bash 
while [ "${#}" -gt 0 ] ; do 
    echo $1 
    shift 
done 

et invoqué avec (par exemple) ./while-num 18173.msg 18179.msg 18201.msg produit

18173.msg 
18179.msg 
18201.msg 

Sur mon système Ubuntu-12, les mêmes résultats de sortie lorsque la première ligne est #!/bin/sh. (Sur Ubuntu, le shell par défaut est dash au lieu de bash.) Il fonctionne également correctement lorsque la ligne while est remplacée par while[ $# -gt 0 ] ; do (les guillemets et les accolades ne sont pas nécessaires car $# renvoie un nombre).

+0

Ouais, les barres obliques inversées ont été mangées, hélas. Le code actuel ressemblait à ceci, où b signifie backslash: while ["$ {b (b # b)}" -gt 0]; fais Je ne suis pas sûr de ce que les backslashes étaient censés accomplir. – user1674956

+0

@ user1674956, vous pouvez probablement éditer le message et le mettre en arrière; entourer le '\ (' par un backtick de formatage de code de chaque côté ''. Sans le contexte global, je ne peux pas dire ce qui se passait. –

Questions connexes