如果在Unix下使用条件,我遇到了问题。需要你的帮助来整理它。
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
有人可以建议解决方案吗?
答案 0 :(得分:0)
尝试修改代码,例如[
和]
符号之间的空格,如下所示:
if [ [ ${a} -eq 1 ] -a [ [ ! -z ${b} ] ] ] -o [ [ ${a} -eq 0 ] -a [ [ -z ${b} ] ] ]; then echo "sucess"; else echo "Failure"; fi
其中-a
表示"和" -o
表示"或"
有时你会使用很多[
和]
;此外,! -z
可以替换为-n
。它可以像这样修复:
if [ \( $a -eq 1 \) -a \( -n "$b" \) ] || [ \( $a -eq 0 \) -a \( -z "$b" \) ]; then
echo "sucess"
else
echo "Failure"
fi
更清楚吗?
答案 1 :(得分:0)
if(a = 1且b不为空)或a = 0且b为空回声"成功"其他 回声失败
if [[ $a == 1 && -n $b ]] || [[ $a == 0 && -z $b ]]; then
echo success
else
echo failure
fi
或者
[[ $a == 1 && -n $b ]] || [[ $a == 0 && -z $b ]] && echo success || echo failure
其他形式:
[[ ($a == 1 && -n $b) || ($a == 0 && -z $b) ]]
[[ (a -eq 1 && -n $b) || (a -eq 0 && -z $b) ]]
而这只是使用(( ))
进行数值比较的情况之一是不可能的。那些宣传(( ))
作为必要的操作者的人应该考虑。
答案 2 :(得分:0)
您的测试存在以下几个问题:
有两种方法可以修复您的测试:
将AND和OR测试放在括号内,'()':
if ( [ $a -eq 1 ] && [ ! -z $b ] ) || ( [ $a -eq 0 ] && [ -z $b ] ) ; then
echo "Success"
else
echo "Failure"
fi
或者,使用bash扩展测试,将你的AND和OR测试放在一个双括号集' [[]]'并省略内部单支架测试:
if [[ $a -eq 1 && ! -z $b ]] || [[ $a -eq 0 && -z $b ]] ; then
echo "Success"
else
echo "Failure"
fi
请注意, -a 和 -o 测试已被弃用,因此坚持使用&&和||从长远来看会更好。
答案 3 :(得分:0)
这可能更多是评论而不是答案,但请记住bash
不是一般的数据处理工具。这是一些构造不能很好地从C-like转换为shell - 就像这个特定示例中的“复杂”逻辑表达式一样。为了便于理解和/或编写,您应该尝试依赖shell特定的功能。
所有这些全球性的措辞都表示,假设您的变量保持“整数”或“无”,您的测试可能只是重写为:
case "${a}:${b}" in
0: | 1:?*)
echo "Success"
;;
*) echo "Failure"
esac