带条件的 For 循环

带条件的 For 循环

我有一个脚本可以在多台服务器上添加用户。由于我要在多台服务器上添加用户,因此我使用了 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

在您的脚本中,您应该将其更改USERuser,因为$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

相关内容