2012-07-09 6 views
1

Je tente actuellement de simplifier un script. Au lieu de saisir manuellement un nom d'hôte pour chaque commande, j'aimerais pouvoir utiliser des variables? des tableaux? de quelque sorte. Je me demandais si vous pouviez aider.Simplifier script bash avec des variables

Exemple: "Est-il un moyen plus facile d'écrire ce"

hostname1=192.168.1.1 
hostname2=192.168.1.2 

echo "What would you like to do?" 
echo "(1)Ping Hosts" 
echo "(2)mkdir /tmp/test" 
echo "(3)write to test.txt" 
read num_variable 

if num_variable = 1 
then 
ping hostname1 
ping hostname2 

if num_variable = 2 
ssh -n hostname1 "mkdir /tmp/test" 
ssh -n hostname2 "mkdir /tmp/test" 

if num_variable = 3 
ssh -n hostname1 "echo 'hello' > /tmp/test/test.txt" 
ssh -n hostname2 "echo 'hello' > /tmp/test/test.txt" 

Exemple:

Hosts=hostname1,hostname2 

Commandes ici? Je détesterais avoir 20 000 lignes quand tout ce que je pourrais faire est de lister les noms d'hôtes en haut et pour chaque variable num exécuter toutes les commandes ci-dessous pour les hôtes répertoriés dans cette section particulière.

+0

Notez que vous voulez 'si [$ num_variable = 1]', etc .. Ouais – chepner

+0

il a été version simplifiée. :) Merci :) –

Répondre

5

Créer un tableau:

hosts=(hostname1 hostname2 hostname3) 

Vous pouvez diviser à plusieurs lignes:

hosts=(
     hostname1 
     hostname2 
     hostname3 
    ) 

itérer sur les éléments:

for host in "${hosts[@]}" 
do 
    echo "$host" 
done 

Accéder à un hôte particulier:

echo "${hosts[2]}" 

Utilisez la commande select pour créer un menu:

PS3='Please enter your choice: ' 
options=("Option 1" "Option 2" "Option3" "Quit") 
select opt in "${options[@]}" 
do 
    echo "Opt: $opt, Reply: $REPLY" 
    case $opt in 
     "Option 1") 
      echo "you chose choice 1" 
      ;; 
     "Option 2") 
      echo "you chose choice 2" 
      ;; 
     "Option 2") 
      echo "you chose choice 3" 
      ;; 
     "Quit") 
      break 
      ;; 
     *) echo invalid option;; 
    esac 
done 
+0

Tous vous a aidé énormément. Merci beaucoup! –

2

bash avoir des tableaux que vous pouvez parcourir.

hosts=(hostname1 
     hostname2 
     hostname3) 

for host in "${hosts[@]}"; do 
    ssh -n "$host" "echo 'hello' > /tmp/test/test.txt" 
done 
+1

Vous avez énormément aidé. Merci beaucoup! –

+0

Heureux de vous aider. La meilleure façon de dire "merci" est d'upvoting la réponse. – jordanm

+0

Je suppose que je suis incapable de. J'ai essayé. :( –

0

Vous pouvez utiliser une boucle for et une déclaration case.

Un exemple d'une boucle for serait:

nodes="192.168.1.1 192.168.1.2 192.168.1.3" 
for node in $nodes 
do 
    echo $node 
done 

Un exemple d'une déclaration case serait

case "$num_variable" in 
    "1") echo "1";; 
    "2") echo "2";; 
    "3") echo "3";; 
esac 

La combinaison des deux est un exercice pour vous :-)

Une bonne référence à bash est le Advanced Bash-Scripting Guide.

+0

Ce serait une bonne façon, si le code était censé être portable à d'autres coquilles POSIX. – jordanm

+0

@jordanm Hé, ce qui est mal avec le code portable? Je pensais que était censé pour être une bonne chose ... –

+0

Restreindre les fonctionnalités de POSIX uniquement peut entraîner un code plus laid et plus difficile à maintenir.La plupart d'entre nous à l'intérieur d'une bulle Linux ne se soucient pas vraiment de savoir si notre code fonctionnera sur une machine * bsd, et préfèrerait utiliser les fonctionnalités étendues. – jordanm