如何在bash脚本中包含三个“AND”条件

时间:2015-02-18 12:09:05

标签: bash

我试图创建三个测试条件,以便在目录上设置diretory和用户及组帐户权限 - 当我使用下面的脚本和-a来包含它们并且它们没有被选中时 - 如果我单独执行它们他们工作 - 我哪里错了?

#!/bin/bash

if [ $(stat -c "%a" /wwwserver/virtual_hosts/www.test1.com) != "750"  -a  $(stat -c "%U" /wwwserver/virtual_hosts/www.test1.com) != "user"  -a  $(stat -c "%G" /wwwserver/virtual_hosts/www.test1.com) != "group" ] ;
 then echo -e "\n\nDirectory Permissions Changed\n" $(stat /wwwserver/virtual_hosts/www.test1.com) "\n" "\nChanging Permissions back to 750 user group\n" | mail -s " Directory Permissions Changed for www.test1.com" mail@test1.com;
        chmod 750 /wwwserver/virtual_hosts/www.test1.com;
        chown -R user.group /wwwserver/virtual_hosts/www.test1.com;
fi

2 个答案:

答案 0 :(得分:2)

基本上你的脚本有效,请检查:

touch "test1.com"
chmod 400 "test1.com"

if [ $(stat -c "%a" "test1.com") != "750" -a $(stat -c "%U" "test1.com") != "user" -a $(stat -c "%G" "test1.com") != "group" ]
then
    echo "do something ..."
fi

这会输出do something ...

在你的情况下,看起来三个条件中的一个确实失败了。意味着文件权限已经750或所有权已设置为user,或者群组所有权设置为group


顺便说一下,我强烈建议正确引用命令替换。这是因为从该命令返回的输出可能包含有问题的字符,否则将由shell解释。关注shell脚本编写过程中的任何情况下的引用,无论您可能期望输出什么 - >猪可以飞!

以上是上面的例子 - 正确引用:

touch "test1.com"
chmod 400 "test1.com"

if [ "$(stat -c "%a" "test1.com")" != "750" -a "$(stat -c "%U" "test1.com")" != "user" -a "$(stat -c "%G" "test1.com")" != "group" ]
then
    echo "do something ..."
fi

答案 1 :(得分:1)

您可以使用多种类似的条件:

s='abc'
n=4
m=5

[[ -n "$s" && $n > 3 && $m > 6 ]] && echo "all conditions passed"
all conditions passed

即。对所有条件使用[[...]],并使用&&进行anding。