diff --git a/src/uu/expr/src/syntax_tree.rs b/src/uu/expr/src/syntax_tree.rs index 0950020c9..d41ef90e2 100644 --- a/src/uu/expr/src/syntax_tree.rs +++ b/src/uu/expr/src/syntax_tree.rs @@ -685,9 +685,9 @@ impl<'a, S: AsRef> Parser<'a, S> { } } "substr" => { - let string = self.parse_expression()?; - let pos = self.parse_expression()?; - let length = self.parse_expression()?; + let string = self.parse_simple_expression()?; + let pos = self.parse_simple_expression()?; + let length = self.parse_simple_expression()?; AstNodeInner::Substr { string: Box::new(string), pos: Box::new(pos), diff --git a/tests/by-util/test_expr.rs b/tests/by-util/test_expr.rs index 0a16d4ea9..fdf68ed73 100644 --- a/tests/by-util/test_expr.rs +++ b/tests/by-util/test_expr.rs @@ -507,6 +507,19 @@ fn test_substr() { .stderr_only("expr: syntax error: unexpected argument 'substr'\n"); } +#[test] +fn test_substr_precedence() { + new_ucmd!() + .args(&["substr", "ab cd", "3", "1", "!=", " "]) + .fails_with_code(1) + .stdout_only("0\n"); + + new_ucmd!() + .args(&["substr", "ab cd", "2", "1", "!=", " "]) + .succeeds() + .stdout_only("1\n"); +} + #[test] fn test_invalid_substr() { new_ucmd!()