Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Unix-IF条件问题_Bash_Unix_If Statement - Fatal编程技术网

Bash Unix-IF条件问题

Bash Unix-IF条件问题,bash,unix,if-statement,Bash,Unix,If Statement,我在Unix下使用if条件时遇到问题。我需要你帮忙整理一下 if (a=1 and b is not null) or a=0 and b is null echo "sucess" else echo failure 我尝试了下面的代码,但我得到了一个错误 if [[ ${a} -eq 1 ] && [[ ! -z ${b} ]]] || [[ ${a} -eq 0 ] && [[ -z ${b} ]]]; then echo "sucess" el

我在Unix下使用if条件时遇到问题。我需要你帮忙整理一下

if (a=1 and b is not null) or a=0 and b is null
echo "sucess"
else 
echo failure
我尝试了下面的代码,但我得到了一个错误

if [[ ${a} -eq 1 ] && [[ ! -z ${b} ]]] || [[ ${a} -eq 0 ] && [[ -z ${b} ]]]; then
    echo "sucess"
else 
    echo "Failure"
fi

有人能提出解决方案吗?

尝试修复
[
]
符号之间类似代码的空格,如下所示:

if [ [ ${a} -eq 1 ] -a [ [ ! -z ${b} ] ] ] -o [ [ ${a} -eq 0 ] -a [ [ -z ${b} ] ] ]; then echo "sucess"; else echo "Failure"; fi
if [ \( $a -eq 1 \) -a \( -n "$b" \) ] || [ \( $a -eq 0 \) -a \( -z "$b" \) ]; then
 echo "sucess"
else
 echo "Failure"
fi
其中
-a
表示“和”,而
-o
表示“或”

有时你会使用很多
[
]
;而且,
-z
可以替换为
-n
。可以这样修复:

if [ [ ${a} -eq 1 ] -a [ [ ! -z ${b} ] ] ] -o [ [ ${a} -eq 0 ] -a [ [ -z ${b} ] ] ]; then echo "sucess"; else echo "Failure"; fi
if [ \( $a -eq 1 \) -a \( -n "$b" \) ] || [ \( $a -eq 0 \) -a \( -z "$b" \) ]; then
 echo "sucess"
else
 echo "Failure"
fi
更清楚吗

如果(a=1且b不为空)或a=0且b为空,则回显“成功”,否则 回波故障

其他形式:

[[ ($a == 1 && -n $b) || ($a == 0 && -z $b) ]]
[[ (a -eq 1 && -n $b) || (a -eq 0 && -z $b) ]]

这只是使用
(())
进行数值比较是不可能的情况之一。那些将<代码>(())< /COD>作为一个命令运算符的人应该考虑。

< P>你的测试有两个问题:

  • 双括号[[]是bash关键字。bash将[[解释为对其内部测试命令的调用,而不是您想要的两层嵌套括号
  • AND(&&)和OR(| |)测试在单个括号内失败
  • 有两种方法可以修复您的测试:

    将AND或OR测试放在括号内,“()”:

    或者,使用bash扩展测试,将AND或Or测试放在双括号集“[[]]”中,并忽略内部单括号测试:

    if [[  $a -eq 1  &&  ! -z $b   ]] || [[  $a -eq 0  &&  -z $b  ]] ; then
        echo "Success"
    else
        echo "Failure"
    fi
    

    请注意,-a和-o测试已被弃用,因此从长远来看,坚持使用&&和| |更好。

    这可能更像是一个注释而不是答案,但请记住
    bash
    不是一个通用的数据处理工具。也就是说,有些结构不能很好地从类C转换为shell,比如“复杂”逻辑表达式。为了便于理解和/或编写,您应该尝试依赖特定于shell的功能

    所有这些通俗的说法都表明,假设您的变量为“整数”或“无”,您的测试可能会简单地重写为:

    case "${a}:${b}" in
        0: | 1:?*)
              echo "Success"
              ;;
        *)    echo "Failure"
    esac
    

    请不要在不告诉确切的错误消息是什么的情况下说你“遇到了错误”。为什么不呢?试着运行我的示例
    if[($a-eq 1)-a(-n“$b”)]|[($a-eq 0)-a(-z“$b”)];然后回显“成功”;否则回显“失败”;fi
    ->
    bash:意外标记“$a”附近的语法错误
    您需要的是转义版本。这就是为什么在bash中不值得使用单括号的原因之一:
    如果[\($a-eq 1\)-a\(-n“$b”\)][\($a-eq 0\)-a\(-z“$b”);则回显“成功”;否则回显“失败”;fi
    
    case "${a}:${b}" in
        0: | 1:?*)
              echo "Success"
              ;;
        *)    echo "Failure"
    esac