2014-08-28 5 views
1

J'ai écrit un long script bash pour configurer un daemom SSH, etc sur android. Le problème est, il est devenu trop long & parfois d'autres utilisateurs ou je ne souhaite que configurer certains aspects de ce que le script a à offrir. Au lieu d'avoir à parcourir le script entier chaque fois qu'il est exécuté, j'aimerais ajouter des options qui dictent ce qui sera exécuté tout en étant capable d'exécuter le script en entier quand rien n'est spécifié.Utilisation de getopt (s) pour exécuter des parties spécifiques du script lorsque le paramètre est passé à l'exécution

Quelque chose comme:

myscript -d -o -p 

Ou

myscript -dop  

Le script se trouve here. Je pense que c'est trop long pour être posté ici.

Fondamentalement, il y a cassé en 5 blocs comme celui-ci:

#!/system/xbin/bash 

echo "---SECTION-ONE---" 

read 
if test then 

while true 
do 

J'étudié à l'aide getopts et ne peut pas tout à fait envelopper la tête autour d'elle tout de suite sans un exemple qui correspond à ce que je fais. Thats pourquoi je poste ici;) Comme toujours merci pour tout inpout.

+0

Voir un [tutoriel getopts] (http://wiki.bash-hackers.org/howto/getopts_tutorial) et un [exemple] (http://stackoverflow.com/questions/16483119/example-of-how- to-use-getopts-in-bash). Que devraient faire les options '-d -o -p'? – zerodiff

+0

Si vous modifiez la question pour clarifier un peu ce que vous voulez faire et ce que vous avez essayé jusqu'à présent, nous serons plus en mesure de vous aider. –

+0

Aussi, vous pouvez créer des liens symboliques avec votre script et faire des choses différentes en détectant le nom par lequel il a été appelé en regardant '$ 0'. – user3132194

Répondre

2

Vous pouvez décomposer les différents corps du script en fonctions pouvant être appelées lorsqu'une option est présente.

#!/bin/bash 

printing_stuff(){ 
    echo "---SECTION-ONE---" 
} 

test_input(){ 
    read -p "Enter something: " input 
    if [[ $input == something ]]; then 
     echo "test successful" 
     # do some stuff 
    fi 
} 

body_loop(){ 
    while true; do 
     echo "this is the loop" 
     # some stuff 
     break 
    done 
} 

if [[ [email protected] ]]; then 
    while getopts "dop" opt; do 
     case $opt in 
      d) 
       printing_stuff 
       ;; 
      o) 
       test_input 
       ;; 
      p) 
       body_loop 
       ;; 
      \?) 
       ;; 
     esac 
    done 
else 
    printing_stuff 
    test_input 
    body_loop 
fi 

Le test [[ [email protected] ]] est fait pour exécuter uniquement la boucle getopts si les arguments du script existent, exécutez sinon tout.

+1

Merci pour cette réponse John, c'était exactement ce dont j'avais besoin. Désolé, il a fallu si longtemps pour répondre ... Commander mon produit final grâce à vous. http://pastebin.com/V3E04CdJ – Geofferey

+0

De rien, heureux que cela a fonctionné pour vous. –

1

Voici un exemple avec ces options, mais je vais modifier s'il y a plus d'informations. Cela suppose que les arguments ne prennent pas de texte variable:

#!/bin/bash 

usage() { 
    echo "$0 [-d] [-o] [-p]" 
    exit 1 
} 

d=false o=false p=false 

while getopts "dop" option; do 
    case "${option}" in 
     d) 
      d=true 
      ;; 
     o) 
      o=true 
      ;; 
     p) 
      p=true 
      ;; 
     *) 
      usage 
      ;; 
    esac 
done 

echo "d = $d" 
echo "o = $o" 
echo "p = $p" 

Exemple d'utilisation:

$ ./test.sh -dop 
d = true 
o = true 
p = true 
$ ./test.sh -d -o -p 
d = true 
o = true 
p = true 
$ ./test.sh -d 
d = true 
o = false 
p = false 

Vous pouvez définir des valeurs variables pour tout ce que vous wan pour tester, par exemple:

if [ "$d" == "true" ]; then 
    # do something 
else 
    # do something else 
fi 
Questions connexes