3
#!/bin/bash 
until [read command -eq "end"] 
do 
echo What command would like to run? 
read command 
if [$command -eq "my-tweets"]; then 
node liri.js $command 
fi 
if [$command -eq "do-what-it-says"];then 
node liri.js $command 
fi 
if [$command -eq "spotify-this-song"]; then 
echo What item would like to query? 
read item 
node liri.js $command $item 
fi 
if [$command -eq "movie-this"]; then 
echo What item would like to query? 
read item 
node liri.js $command $item 
fi 
done 

J'essaie de créer une instruction case/if pour vérifier la valeur d'une variable avant d'exécuter la partie suivante du code. Je veux vérifier la valeur de $command pour créer cette déclaration case/if en fonction de la valeur de l'entrée de l'utilisateur. Je continue d'obtenir la commande erreur non trouvée.Ecriture d'instructions de cas dans un script bash

+0

Indentez votre code. – Cyrus

+2

Regardez s'il vous plaît: http://www.shellcheck.net/ – Cyrus

Répondre

1

Les parenthèses ont besoin d'espaces autour d'elles. [] n'est pas une fonctionnalité de langage shell, [ est un nom de commande qui nécessite un argument de fermeture ] pour que les choses soient belles ([read recherchera une commande (exécutable ou intégrée) appelée littéralement [read).

La comparaison de chaînes à l'intérieur de [] est faite avec =, -eq est pour la comparaison d'entier. Vous devez parcourir la page de manuel dash(1) ou la POSIX shell language specification. Ils ne sont pas si gros (Bash est plus gros). Vous trouverez également la syntaxe de l'instruction case.

+1

Aussi, double-citez toutes les références de variable. 'if [$ command =" my-tweets "]' donnera une erreur si 'command 'est vide ou contient plusieurs mots ou ... plusieurs autres conditions. 'if [" $ command "=" my-tweets "]' fonctionnera. –

+1

Merci beaucoup. Cela a vraiment aidé. J'ai été capable d'obtenir rapidement mon code pour évaluer si une commande était égale à une valeur définie et partir de là. –

0

En plus des erreurs de syntaxe @PSkocik ont ​​souligné, lorsque vous avez un certain nombre de conditions if mutuellement exclusives, il est généralement plus clair/mieux utiliser if ... elif... au lieu d'un groupe si if blocs séparés:

if [ "$command" = "my-tweets" ]; then 
    node liri.js "$command" 

elif [ "$command" = "do-what-it-says" ];then 
    node liri.js "$command" 

elif [ "$command" = "spotify-this-song" ]; then 
...etc 

mais quand vous comparez une seule chaîne ("$command") contre un groupe possible cordes/modèles, case est une façon encore plus claire pour le faire:

case "$command" in 
    "my-tweets") 
     node liri.js "$command" ;; 

    "do-what-it-says") 
     node liri.js "$command" ;; 

    "spotify-this-song") 
...etc 
esac 

En outre, lorsque plusieurs cas différents exécutent tous le même code, vous pouvez inclure plusieurs correspondances dans un seul cas. En outre, il est une bonne idée d'inclure un modèle par défaut pour faire face à des chaînes qui ne correspondent pas autre chose:

case "$command" in 
    "my-tweets" | "do-what-it-says") 
     node liri.js "$command" ;; 

    "spotify-this-song" | "movie-this") 
     echo What item would like to query? 
     read item 
     node liri.js "$command" "$item" ;; 

    *) 
     echo "Unknown command: $command" ;; 
esac 

Et comme pour la boucle: généralement, vous auriez soit utiliser quelque chose comme while read command; do (notez l'absence de [ ], parce que nous utilisons la commande read, pas la commande test aka [); ou utilisez simplement while true; do read ... puis vérifiez la condition de fin et break à partir de l'intérieur de la boucle. Ici, il est probablement préférable de faire le dernier:

while true; do 
    echo "What command would like to run?" 
    read command 
    case "$command" in 
     "my-tweets" | "do-what-it-says") 
      node liri.js "$command" ;; 

     "spotify-this-song" | "movie-this") 
      echo What item would like to query? 
      read item 
      node liri.js "$command" "$item" ;; 

     "end") 
      break ;; 

     *) 
      echo "Unknown command: $command" ;; 
    esac 
done 
+0

Merci beaucoup. C'était un super cours intensif dans exactement ce que je cherchais. Le code fonctionne parfaitement maintenant. –

0

Utilisation simple de cas dans bash basé sur un argument.

case "$1" in 
    argument1) 
     function1() 
     ;; 

    argument2) 
     function2() 
     ;; 
    *) 
     defaultFunction() 
     ;; 

esac