Bash Unix-IF条件问题
我在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
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>你的测试有两个问题:
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