Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何将用户输入解析为bash脚本_Linux_Bash_Shell_Scripting - Fatal编程技术网

Linux 如何将用户输入解析为bash脚本

Linux 如何将用户输入解析为bash脚本,linux,bash,shell,scripting,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 s

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

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
读取主机服务时;做
以美元计算的服务费;做
ssh“$host”服务“$service”重新启动
完成

完成数组、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

你可能想学。为什么你想让争论看起来像那样?是因为您认为它看起来不错,还是因为您有其他脚本生成这些字符串?因为通常更容易遵循标准的操作方式,在bash脚本的情况下,就是每个参数传递一个参数,而标点符号要少得多。(例如,
restart server1:nginx,mysqld server2:mysqld,apache server3:mongodb,apaches
)对不起,@tripleee在这里发布问题后,我已经解决了我的问题。但我不知道如何结束这个问题。你应该选择某人的答案,或者发布你自己的答案,并选择该答案作为正确答案。因此,当人们搜索这个,他们可以得到一些见解,我喜欢Tripleee的答案,但我认为你必须提供一个文件。这里没有问到。看起来您想要的是一种单行程序类型的东西。您可以使用shell内置的
“${var*:}”
参数替换,而不是不吸引人的
$(echo | cut)
。这一点很好!我在这里干得又快又脏。。实际上,我还没有用这样的数组做过。。。是否要通过编辑向我显示?
    Go To server1: restart nginx
    Go To server1: restart mysqld
    Go To server2: restart sshd
    Go To server2: restart apache2