diff --git a/src/uu/expr/src/syntax_tree.rs b/src/uu/expr/src/syntax_tree.rs index e0e786b3a..c55fb0bdc 100644 --- a/src/uu/expr/src/syntax_tree.rs +++ b/src/uu/expr/src/syntax_tree.rs @@ -464,12 +464,15 @@ fn infix_operator_or(values: &[String]) -> String { assert!(values.len() == 2); if value_as_bool(&values[0]) { values[0].clone() - } else { + } else if value_as_bool(&values[1]) { values[1].clone() + } else { + 0.to_string() } } fn infix_operator_and(values: &[String]) -> String { + assert!(values.len() == 2); if value_as_bool(&values[0]) && value_as_bool(&values[1]) { values[0].clone() } else { diff --git a/tests/by-util/test_expr.rs b/tests/by-util/test_expr.rs index d4cca43a2..28cfcf0ec 100644 --- a/tests/by-util/test_expr.rs +++ b/tests/by-util/test_expr.rs @@ -143,6 +143,14 @@ fn test_or() { .args(&["12", "|", "9a", "+", "1"]) .succeeds() .stdout_only("12\n"); + + new_ucmd!().args(&["", "|", ""]).run().stdout_only("0\n"); + + new_ucmd!().args(&["", "|", "0"]).run().stdout_only("0\n"); + + new_ucmd!().args(&["", "|", "00"]).run().stdout_only("0\n"); + + new_ucmd!().args(&["", "|", "-0"]).run().stdout_only("0\n"); } #[test] @@ -152,14 +160,20 @@ fn test_and() { .succeeds() .stdout_only("foo\n"); - new_ucmd!().args(&["", "&", "1"]).run().stdout_is("0\n"); - - new_ucmd!().args(&["14", "&", "1"]).run().stdout_is("14\n"); + new_ucmd!() + .args(&["14", "&", "1"]) + .succeeds() + .stdout_only("14\n"); new_ucmd!() .args(&["-14", "&", "1"]) - .run() - .stdout_is("-14\n"); + .succeeds() + .stdout_only("-14\n"); + + new_ucmd!() + .args(&["-1", "&", "10", "/", "5"]) + .succeeds() + .stdout_only("-1\n"); new_ucmd!() .args(&["0", "&", "a", "/", "5"]) @@ -171,10 +185,9 @@ fn test_and() { .run() .stdout_only("0\n"); - new_ucmd!() - .args(&["-1", "&", "10", "/", "5"]) - .succeeds() - .stdout_only("-1\n"); + new_ucmd!().args(&["", "&", "1"]).run().stdout_only("0\n"); + + new_ucmd!().args(&["", "&", ""]).run().stdout_only("0\n"); } #[test]