如何解析用户输入到bash脚本

时间:2013-10-15 19:25:26

标签: linux bash shell scripting

我想要一个脚本,它将在各自的服务器上重新启动已定义的服务。我想将如下参数传递给脚本:例如:

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

2 个答案:

答案 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

答案 1 :(得分:1)

数组,IFS和for循环哦我的!百万种方式来做到这一点。我喜欢阵列所以我用它们。我不确定你是想单独调用每个服务还是一次调用所有服务,所以我是单独完成的。此外,您还可以轻松构建单个命令以从此方法运行。您会注意到我正在更改IFS来处理逗号。我删除了服务器之间的括号和括号,所以你可以这样调用它:

CALL SCRIPT:

./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

输出:

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