2013-10-15 56 views
1

我想要一個腳本,它將在各自的服務器上重新啓動已定義的服務。我想通過參數如下的腳本:例如:如何解析用戶輸入到bash腳本

sh execute.sh [server1:nginx,mysqld],[server2:mysqld,apache2],[server3:mongodb,apache2] 

所以應該去Server1和重啓nginx的和mysqld服務在那邊。然後到server2,並且應該在那裏重新啓動mysqld和apache等等。

我的劇本象下面這樣:

#!/bin/bash 
# create an array of server:services 
a=($(echo "$1" | gawk 'BEGIN { FS="[]],[[]" } ; { print $1, $2, $3 }' | tr -d '[]')) 
# add a for loop here to iterate values in array with code below 
for var in "${a[@]}" ; do 
# get server name 
server1=$(echo $a[0] | cut -d ':' -f1) 
# get your services as space separated 
servs1="$(echo $a[0] | cut -d ':' -f2 | tr ',' ' ')" 
# loop your services 
for s in $servs1; do 
    ssh $server1 "service $s restart" 
done 
done 

上述腳本只能夠到grep的第一個服務器名稱和服務。請幫助獲取他人。

Original question

+0

你可能想學習[傀儡](http://puppetlabs.com/)。 –

+1

爲什麼你想讓這個參數看起來像那樣?僅僅因爲你認爲它看起來不錯,或者因爲你有其他一些腳本產生這些字符串?因爲遵循標準的做事方式通常比較容易,在bash腳本的情況下,每個參數傳遞一個參數,標點符號少得多。 (比如''restart server1:nginx,mysqld server2:mysqld,apache server3:mongodb,apaches') – rici

回答

1

陣列,IFS,和for循環噢,我的!百萬種方式來做到這一點。我愛陣列,所以我用它們。我不確定您是否想要單獨或全部地調用每項服務,因此我是單獨完成的。此外,您還可以輕鬆構建一個單一的命令以從此方法運行。你會注意到我正在改變IFS來處理逗號。我刪除了支架和之間的服務器,所以你會這樣稱呼它:

CALL SCRIPT:

./test2 server1:nginx,mysqld server2:sshd,apache2 

CODE:

#!/bin/bash 
    #-- samples: server1:nginx,mysqld server2:mysqld,apache2 
    declare -a list 
    read -a list <<< "${@}" 
    echo ${list[@]} 

    for ((i=0; i<${#list[@]}; i++)) ;do 

     IFS=' ' 
     server=$(echo ${list[$i]} | cut -d: -f1) 
     services=$(echo ${list[$i]} | cut -d: -f2) 

     IFS=, 
     for each in $services ;do 
      echo "Go To $server: restart $each" 
     done 

    done 

OUTPUT:

Go To server1: restart nginx 
    Go To server1: restart mysqld 
    Go To server2: restart sshd 
    Go To server2: restart apache2 
+0

您可以使用shell的內置''$ {var#*:}''參數替換,而不是無用的'$(echo | cut)'。 – tripleee

+0

好點!我在這裏做得很快而且髒......其實我沒有用這樣的數組來做...你想通過編輯讓我看看嗎? –

1

你爲什麼不乾脆

while read host services; do 
    for service in $services; do 
     ssh "$host" service "$service" restart 
    done 
done <<____HERE 
    server1 nginx mysqld 
    server2 mysqld apache 
    server3 mongodb apache2 
____HERE 
+0

對不起,@tripleee我在發佈問題後解決了我的問題。但我不知道如何解決這個問題。 – linuxnewbee

+0

您應該選擇某人的答案或張貼您自己的答案,並將其選爲正確答案。因此,當人們搜索這個,他們可以得到一些見解 –

+0

我喜歡Tripleee的答案,但我會假設你必須餵它一個文件。這裏沒有提到。好像你想要一個單線型的東西。 –