首页 > 解决方案 > 如果条件不考虑第二个条件,为什么我的 bash?

问题描述

我有以下代码片段。

if [ "$2" == "azure" ] && [ -n $11 ]; then
    CRED_KIND=$2
    CRED_NAME=$3
    CRED_UNAME=$4
    CRED_PWD=$5
    TWR_UNAME=$6
    TWR_PWD=$7
    CLNT=$8
    SEC=$9
    SUBS=$10
    TEN=$11
    credsplaybook $CRED_KIND $CRED_NAME $CRED_UNAME $CRED_PWD $TWR_UNAME $TWR_PWD $CLNT $SEC $SUBS $TEN
    exit 1
fi

出于某种原因,即使我只传递了 7 个参数,它也会继续执行 if 条件,只考虑第一次检查并跳过第二次检查。根据条件,它应该检查第二个参数是否为“azure”以及是否总共传递了 11 个参数。

./createResourcesPlaybook.sh cred azure test123 myuser mypass tower towerpass
[INFO] Creating Playbook for Credential with type azure

.
.
.
rest of output

标签: bashshellrhel7

解决方案


[ "$2" == "azure" ] && [ -n $11 ]是两个不相关的命令链接在一起,如果第一个为“真”,则仅执行第二个。

此外,正如其他人所提到的,两位(或更多)位置参数变量需要用大括号括起来。所以$11需要${11}

命令-n选项(是test[别名test)是检查字符串是否为空,但如果${11}不存在,则它不等于空字符串,而是什么都没有,使-n检查无效。

要解决这两个问题,请使用-a两个条件的逻辑和选项,并使用双引号创建${11}一个字符串:

if [ "$2" == "azure" -a -n "${11}" ]

推荐阅读