对于有条件的循环


0

我有一个脚本,可以在许多服务器上添加用户。因为我正在添加许多服务器,我正在使用循环。

以下是成功添加用户时的输出。

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

任何有关这方面的帮助将受到高度赞赏。

Answers:


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从命令行运行,看看我的意思。


是的,通常建议使用小写变量名,这样就不会意外覆盖bash变量。
格伦杰克曼2013年

欢迎你,@ maneeshshetty。您是否知道超级用户说“谢谢”的方式是投票给您认为有用的答案?我看你还没有投票。只需点击其分数旁边的向上投票箭头即可。它只需要一秒钟 - 但这样你就可以向别人付钱。
slick

我不知道这一点,我就这么做了!:-)
maneeshshetty 2013年

1
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

没有想过read在那里使用和分配变量,很好。
slhck 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.