web-dev-qa-db-fra.com

si, Elif, d'autre problèmes de déclaration dans Bash

Je n'arrive pas à comprendre le problème avec l'instruction suivante if en ce qui concerne la Elif et then. Gardez à l'esprit que la printf est toujours en cours de développement. Je n'ai pas encore réussi à la tester dans la déclaration.

L'erreur que je reçois est:

./timezone_string.sh: line 14: syntax error near unexpected token `then'
./timezone_string.sh: line 14: `then'

Et la déclaration est comme ça.

if [ "$seconds" -eq 0 ];then
   $timezone_string="Z"
Elif[ "$seconds" -gt 0 ]
then
   $timezone_string=`printf "%02d:%02d" $seconds/3600 ($seconds/60)%60`
else
   echo "Unknown parameter"
fi
310
StuStirling

Il manque un espace entre Elif et [:

Elif[ "$seconds" -gt 0 ]

devrait être

Elif [ "$seconds" -gt 0 ]

Comme je vois cette question suscite beaucoup d'opinions, il est important d'indiquer que la syntaxe à suivre est la suivante:

if [ conditions ]
# ^ ^          ^

ce qui signifie que des espaces sont nécessaires autour des crochets. Sinon, ça ne marchera pas. Cela est dû au fait que [ lui-même est une commande.

La raison pour laquelle vous ne voyez pas quelque chose comme Elif[: command not found (ou similaire) est qu'après avoir vu if et then, le shell recherche soit Elif, else ou fi. Cependant, il trouve une autre then (après le Elif[ mal formaté _). Seulement après après avoir analysé l'instruction, celle-ci sera exécutée (et un message d'erreur comme Elif[: command not found sera émis).

393
fedorqui

Vous avez des problèmes de syntaxe avec votre script. Voici une version corrigée:

#!/bin/bash

if [ "$seconds" -eq 0 ]; then
   timezone_string="Z"
Elif [ "$seconds" -gt 0 ]; then
   timezone_string=$(printf "%02d:%02d" $((seconds/3600)) $(((seconds / 60) % 60)))
else
   echo "Unknown parameter"
fi
253
anubhava

[ est une commande. Il doit être séparé par une espace de la déclaration précédente:

Elif [
22
choroba

Je vous recommanderais de jeter un coup d’œil sur les bases du conditionnement à bash.

Le symbole "[" est une commande et doit précéder d’un espace. Si vous ne donnez pas d'espaces après votre Elif, le système interprète Elif [ comme une commande particulière qui n'est certainement pas ce que vous voudriez à ce moment-là.

tilisation:

Elif(A COMPULSORY WHITESPACE WITHOUT PARENTHESIS)[(A WHITE SPACE WITHOUT PARENTHESIS)conditions(A WHITESPACE WITHOUT PARENTHESIS)]

En bref, éditez votre segment de code pour:

Elif [ "$seconds" -gt 0 ]

ça irait sans erreur de compilation. Votre segment de code final devrait ressembler à ceci:

#!/bin/sh    
if [ "$seconds" -eq 0 ];then
       $timezone_string="Z"
    Elif [ "$seconds" -gt 0 ]
    then
       $timezone_string=`printf "%02d:%02d" $seconds/3600 ($seconds/60)%60`
    else
       echo "Unknown parameter"
    fi
4
Mr. Weirdo