gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:22 25 4
gpt4 key购买 nike

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

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 :

最佳答案

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

输出:

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

关于linux - 如何将用户输入解析为 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19389389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com