使用 if 语句错误 -> [: 缺少 `]' 时出现问题

使用 if 语句错误 -> [: 缺少 `]' 时出现问题
#!/bin/bash

for (( x=7; x <= 65; x+=2 )) 

do


    if [ $x!=57 && $x!=59 && $x!=29 && $x!=53 ]
    then
        cd charged_$x 
        cp -f ~aman/user_ana_normal_mode/Testforaman/user_ana.so .
        cd ..
    fi

done

无法找出问题,请帮忙

答案1

[ $x!=57 && $x!=59 && $x!=29 && $x!=53 ]

[是一个命令,它遵循与 相同的规则ls&&是一种对命令进行条件分组的 shell 方式。在 中[ foo && bar ],shell 运行命令[ foo,如果成功,则运行bar ]。该[命令失败,因为它希望将 a]作为最后一个参数,因此第二个命令不会运行。

[[ .. ]]然而,特殊的条件语法确实支持&&,因此您可以使用[[ $x != 57 && $x != 59 && ... ]].请注意,它仍然需要运算符周围有空格。 Plain$x!=57将用于测试是否$x!=57为非空字符串,无论 的值如何,它始终都是非空字符串x

或者,将结束语]放在&&[ "$x" != 57 ] && [ "$x" != 59 ] && ...

答案2

以下代码应该可以工作:

#!/bin/bash

for (( x=7; x <= 65; x+=2 )) 
do
    if [ "$x" -ne 57 ] && [ "$x" -ne 59 ] && [ "$x" -ne 29 ] && [ "$x" -ne 53 ]; then
        cd charged_$x 
        cp -f ~aman/user_ana_normal_mode/Testforaman/user_ana.so .
        cd ..
    fi
done
  • 最好针对每种情况使用单独的牙套。
  • 我们应该使用-ne而不是!=,因为我们正在比较整数。

答案3

您同时使用太多条件,因此您需要更改其语法。

if  [ $x!=57 ] && [ $x!=59 ] && [ $x!=29 ] && [ $x!=53 ]

这会起作用

答案4

您的代码有两个错误:!=操作员需要在其周围留有空格,并且 应该&&位于各个[ ... ]测试之间。

而不是使用大量单独的测试:

for (( x = 7; x <= 65; x += 2 )); do
    case $x in
        29|53|57|59) ;;
        *)
            cp -f ~aman/user_ana_normal_mode/Testforaman/user_ana.so "charged_$x"
    esac
done

我还去掉了一半没用的cd

相关内容