簡體   English   中英

如何將用戶輸入解析為bash腳本

[英]How to parse user input to bash script

我想要一個腳本,它將在各自的服務器上重新啟動已定義的服務。 我想將以下參數傳遞給腳本:例如:

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第一個服務器名稱和服務。 請幫助獲得他人。

原始問題

你為什么不簡單

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

數組,IFS和for循環哦,天哪! 數以百萬計的方式做到這一點。 我喜歡數組,所以我使用了它們。 我不確定您是要單獨調用還是一次調用所有服務,所以我是單獨進行的。 另外,您還可以輕松地構建一個命令來從此方法運行。 您會注意到我正在更改IFS以處理逗號。 我卸下了服務器之間的括號和,因此您將這樣稱呼它:

通話腳本:

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

碼:

    #!/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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM