在处理项目工具链时,显然我不理解bash
列表。
从手册:
“manual”:man bash
列表:
列表是由一个或多个管道分隔的一个或多个管道的序列 运营商;,&,&&,或||,
[...]
在这些列表运营商中,&&和||具有相同的优先权,其次是; 和&,具有相同的优先权。
[...]
AND和OR列表是由一个或多个管道分隔的序列 和&&和||分别控制运营商。 AND和OR列表是 以左关联性执行。 AND列表的格式为
command1&&命令2
当且仅当command1返回退出状态时,才执行command2 为零。
OR列表的格式为
command1 ||命令2
当且仅当command1返回非零退出时才执行command2 状态。 AND和OR列表的返回状态是退出状态 列表中执行的最后一个命令 [格式化我的]
而不是看起来像这样的代码:
command1
if [ $? -eq 0 ];
then
command2
fi;
我们可以这样做:
command1 && command2
在我的一个脚本中,我的代码功能与此相同:
#!/bin/bash
s () { return 0; }
f () { return 1; }
l () { echo "Y"; }
#Why does this output "Y"?
f && f || true && s && l
#This does what I want:
f && { f; s && l; }
在上面的例子中,我希望(并且非常想要)f || true && s && l
仅在f
没有失败时运行。但是,我必须使用f && { f; s && l; }
来获得我想要的功能。
我误解了什么?为什么链条“继续”超过第一个&&
?
命令链不应该在f &&
之后停止运行,因为当且仅当command1返回非零退出状态时“执行command2”?
PS:我希望它的功能如下。
if (f == 0) {
if (f != 0) {
if (0 == 0) {
if (s == 0) {
l;
}
}
}
}
答案 0 :(得分:1)
为什么输出“Y”?
f && f || true && s && l
is the same as
(
(
(
(
f && f
) || true
) && s
) && l
)
但是s = false
(
(
f && f
) || true
) && s
-> false
实际上
f && f || true && s && l -> l
关于PS
not (f=0) || not (f!=0) || not (0=0) || not (s=0) || l