2012-07-09 84 views
1

我目前正試圖簡化腳本。而不是手動輸入每個命令的主機名稱,我想能夠使用變量?數組?某種程度上。想知道你能否幫忙。用變量簡化bash腳本

例子: 「有沒有寫這個更簡單的方法」

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" 

例子:

Hosts=hostname1,hostname2 

命令嗎?

我不想擁有20,000行,當我所能做的就是列出主機名在頂部,併爲每個num變量執行下面列出的特定部分中的主機的所有命令。

+0

請注意,你想'如果[$ num_variable = 1]'等 – chepner 2012-07-09 19:05:49

+0

是的..它是簡化版本。 :)謝謝:) – 2012-07-11 15:59:23

回答

5

創建的數組:在所述元件

hosts=(
     hostname1 
     hostname2 
     hostname3 
    ) 

迭代:

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

訪問特定宿主

hosts=(hostname1 hostname2 hostname3) 

可以將其分割爲多行:

echo "${hosts[2]}" 

使用select命令創建一個菜單:

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

大家都非常幫助,非常感謝! – 2012-07-09 18:37:09

2

Bash確實有可以迭代的數組。

hosts=(hostname1 
     hostname2 
     hostname3) 

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

你們所有人都非常幫助。非常感謝! – 2012-07-09 18:36:40

+0

樂於幫助。說「謝謝」的最好方法是通過提出答案。 – jordanm 2012-07-09 18:52:59

+0

我想我無法。我試過了。 :( – 2012-07-11 15:58:24

0

您可以使用for環路和case聲明。

一個for循環的一個例子是:

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

一個case聲明的一個例子是

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

結合使用這兩種是你的一個鍛鍊:-)

bash的一個很好的參考是Advanced Bash-Scripting Guide

+0

如果代碼可以移植到其他POSIX shell中,這將是一個好方法。 – jordanm 2012-07-09 18:54:54

+0

@jordanm嗨,可移植代碼有什麼問題?我認爲應該是這樣的要成爲一件好事物...... – 2012-07-09 19:21:37

+0

限制自己使用POSIX-only功能會導致維護代碼變得越來越難以維護並且越來越困難。我們大多數人在Linux泡沫裏面真的不在乎我們的代碼是否會在* bsd機器上運行,而是更願意使用擴展功能。 – jordanm 2012-07-09 19:53:21