Bash 在if语句中正确嵌套条件语句

Bash 在if语句中正确嵌套条件语句,bash,if-statement,nested,Bash,If Statement,Nested,我有一套条件句可以很好地工作。但是,我需要调整算法,使其更加复杂,这涉及bash中的嵌套条件 例如,这里有一个这样的块: a1=C a2=P a3=E a4=1 a5=7 a6=0 a7=4 a8=T a9=K a10=S letters=$(echo {A..Z} | tr -d ' ') if [ "$c3" != "$a3" ] then c3=${letters:$((RANDOM%26+1)):1} if [ "$c3" == "$a3" ] &

我有一套条件句可以很好地工作。但是,我需要调整算法,使其更加复杂,这涉及bash中的嵌套条件

例如,这里有一个这样的块:

a1=C
a2=P
a3=E
a4=1
a5=7
a6=0
a7=4
a8=T
a9=K
a10=S
letters=$(echo {A..Z} | tr -d ' ')
if [ "$c3" != "$a3" ]
    then
        c3=${letters:$((RANDOM%26+1)):1}
        if [ "$c3" == "$a3" ] && (( $count % $difficulty3 != 0 ))
        then
            c3=${letters:$((RANDOM%26+1)):1}
            if [ "$c3" == "$a3" ] && [ [ "$c1" != "$a1" ] || [ "$c2" != "$a2" ] ]
            then
                c3=${letters:$((RANDOM%26+1)):1}
            fi
        fi
    fi
最里面的if语句基本上检查c3和a3是否相等,以确保c1和a1也相等,c2和a2也相等。如果不是,它将再次重新分配变量c3

我的想法是做一个if-true和true或true类型的逻辑,但这在这里似乎不起作用。我得到:

line 367: [: too many arguments
所有的c和a变量都是一个字母或数字,所以我在相关文章中看到的带空格的字符串不会引起这个问题


当我尝试在整个过程中使用双括号而不是单括号时,脚本根本无法运行。括号不起作用,因为它们不是算术运算。。。所以我现在在挠头。看来这是做嵌套条件句的正确方法。。。我遗漏了什么?

方括号看起来像特殊的shell语法,但根本不是。[只是测试的另一个名称,结束语]只是一个被忽略的参数

可以使用花括号,这是一种特殊语法:

if [ "$c3" == "$a3" ] && { [ "$c1" != "$a1" ] || [ "$c2" != "$a2" ]; }
括号也起作用。额外的;不需要,但它们会创建不必要的子壳,因此我建议使用花括号:

if [ "$c3" == "$a3" ] && ( [ "$c1" != "$a1" ] || [ "$c2" != "$a2" ] )

方括号看起来像特殊的shell语法,但它们根本不是。[只是测试的另一个名称,结束语]只是一个被忽略的参数

可以使用花括号,这是一种特殊语法:

if [ "$c3" == "$a3" ] && { [ "$c1" != "$a1" ] || [ "$c2" != "$a2" ]; }
括号也起作用。额外的;不需要,但它们会创建不必要的子壳,因此我建议使用花括号:

if [ "$c3" == "$a3" ] && ( [ "$c1" != "$a1" ] || [ "$c2" != "$a2" ] )

@Roadowl基本上我想做的是,如果所有降低的数字a和c变量都匹配,这很好,但如果不匹配,如果它们中的任何一个不相等,那么我会再次执行赋值。如果您向脚本添加一些初始值,以便其他人可以运行它,并看到它以您描述的方式失败?@Roadowl就是这样,代码自行运行,除了我添加的1个变量-我知道你也指比较变量,我只是使用[[.看到这个答案:.@InterLinked:你从来没有给困难3赋值。@Roadowl基本上我想做的是,如果所有降下的数字a和c变量都匹配,这很好,但是如果不匹配,如果它们中的任何一个不相等,那么我会重新赋值。如果你给脚本添加一些初始值,这样其他人就可以运行它,并看到它失败,我n按照你所描述的方式?@Roadowl就是这样,代码本身运行,除了我添加的1个变量-我知道你也指比较变量,我只是使用[[]添加了那些考虑者。请看这个答案:。@InterLinked:你从来没有给困难分配过什么3。