erreur de syntaxe de script shell bash [duplicate]
-
10-07-2019 - |
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
}
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. :)