我有一个脚本可以在多台服务器上添加用户。由于我要在多台服务器上添加用户,因此我使用了 for 循环。
以下是成功添加用户时的输出。
0,22529,User added.
如果未添加用户,则会出现此错误
1,23996,CLI failed to connect to database.
或者
1,22560,The current state of the server does not allow this action.
script Begin
read user
echo -e '\E[32;40m'"\033[1mPlease wait .... adding id on all server\033[0m"
PORT=777
USER=User
PASSWORD=****
for server in server1.abc.com server2.abc.com
do
command // to add user
done
Script end
我想要根据循环传递的服务器列表来回显添加的用户和未添加的用户。
例如。
User added in server1.abc.com
user failed to add in server2.abc.com
任何帮助都将不胜感激。
答案1
如果你想使用某个命令的标准输出,你可以使用命令替换并将其包装在 里面$(…)
。
我们可以使用 Bash 3 及以上版本引入的运算符来检查输出是否符合某个正则表达式=~
。如果正则表达式匹配,则测试将返回 true,因此我们可以在之后执行另一个命令&&
。如果不匹配,则测试将返回 false,并||
执行之后的命令。
因为我们要检查输出是否包含单词added
,所以以下内容就足够了:
for server in server1.abc.com server2.abc.com
do
[[ "$(command)" =~ added ]] \
&& echo "User ${user} added in ${server}" \
|| echo "User ${user} failed to add in ${server}"
done
在您的脚本中,您应该将其更改USER
为user
,因为$USER
是携带您的用户名的全局环境变量。尝试echo $USER
从命令行运行以了解我的意思。
答案2
for server in ...; do
command | while IFS=, read exitstatus id message; do
if [[ $exitstatus == "0" ]]; then
echo "User added on $server"
else
echo "Failed to add user on $server: $message"
fi
done
done
但是,请检查实际的退出状态command
——失败时它是否返回非零的退出状态?
for server in ...; do
if output=$(command); then
echo "User added on $server"
else
echo "Failed to add user on $server: $output"
fi
done