Question

    

Cette question a déjà une réponse ici:

         

J'ai écrit une fonction dans le script bash. Cependant, il se plaint de la syntaxe. Je ne vois vraiment pas ce que c'est ... le message d'erreur est [: manquant `] '

addem() {
            if [ $# -eq 0] || [ $# -gt 2 ]
            then
                    echo -1
            elif [ $# -eq 1 ]
            then
                    echo $[ $1 + $1 ]
            else
                    echo $[ $1 + $2 ]
            fi
    }
Était-ce utile?

La solution

Vous avez besoin d'un espace avant le premier ] . C'est-à-dire:
changement:
si [$ # -eq 0] || [$ # -gt 2]
à:
si [$ # -eq 0] || [$ # -gt 2]

Autres conseils

Essayez:

if [ $# -eq 0 ] || [ $# -gt 2 ]

(Il n'y avait pas d'espace entre 0 et].)

indyK1ng: le "#" n'est pas traité comme un commentaire, car le symbole "$" échappe au personnage suivant. Le " $ # " est une variable interne représentant le nombre de paramètres de position existant dans le contexte actuel. Cela peut être considéré comme le nombre d'arguments de ligne de commande du script shell, mais ce tableau peut être réinitialisé à l'aide de l'option "set - [args]". construit en.

Joakim Elofsson: La structure globale de la déclaration if est correcte, la balise "" ;;". est requis uniquement avant le " alors " et avant le " fi " si ceux-ci ne sont pas listés sur une ligne séparée.

Le problème est l’espace entre les " 0 " et le support. Bash exige que les crochets utilisés pour délimiter les expressions conditionnelles soient marqués avec au moins un seul espace à partir de l'expression.

        if [ $# -eq 0] || [ $# -gt 2 ]    # Wrong

        if [ $# -eq 0 ] || [ $# -gt 2 ]    # Correct

Sur une note supplémentaire, les deux expressions conditionnelles peuvent être combinées. L’association des exploitants s’assurera que tout se passe bien.

        if [ $# -eq 0 -a $# -gt 2 ]   # Even Better

J'ai tendance à préférer les fonctionnalités étendues offertes avec les doubles crochets pour l'évaluation de l'expression. Notez que la combinaison des deux évaluations est effectuée avec un opérateur différent. Je trouve cela plus lisible.

        if [[ $# -eq 0 || $# -gt 2 ]]   # My preference

Plus tard dans le script, l'utilisation de crochets simples pour l'addition d'entiers n'est pas recommandée. Les crochets simples évaluent une expression en booléen. Les doubles parenthèses sont utilisées pour le calcul des nombres entiers.

                echo $[ $1 + $1 ]   # Evaluation of an expression

                echo $(( $1 + $1 ))   # Integer math

Bash est sensible aux espaces. Dans votre première ligne, remplacez si [Y -eq X] par [Y -eq X] (espace avant le "]"

J'utiliserais des constructions de test étendues (BASH) comme démontré ci-dessous. Je pense que cela réduirait le nombre de caractères et augmenterait la lisibilité (du moins pour les programmeurs). : -)

addem() { 
        if (( $# == 0 || $# > 2 )) 
        then 
                echo -1 
        elif (( $# == 1 )) 
        then 
                echo (( $1 + $1 )) 
        else 
                echo (( $1 + $2 ))
        fi 
 }

Évitez les crochets et utilisez plutôt test :

if test $# -eq 0 || test $# -gt 2
then
    echo -1
elif test $# -eq 1
then
    echo $(( $1 + $1 ))
else
    echo $(( $1 + $2 ))
fi

Obtenir un meilleur style de shell vous rendra beaucoup mieux. :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top