I have an if
line in my shell script that looks like this:
if [ 0 -lt 2 -o (0 -gt 3 ) ]
and this gives the error:
line 3: syntax error near unexpected token `('
So I looked at man test
to be sure that parens were supported, and sure enough, very near the top of the man page, they are! What gives!?
The example above doesn't exactly match the code because I was trying to clean it to prove a point, but this is my repo if you needed context.
EDIT: changed the if line to match the error.
The parenthesis are passed to the test
command as arguments. The [ ... ]
expression is just another way to type the test
command. The only difference is that the last argument for the [
command must be ]
.
So you should escape the parenthesis just as any other arguments you pass to a command to avoid the shell interpretation:
if [ \( $# -lt 2 \) -o \( $# -gt 3 \) ]
Alternatively, use single quotes:
if [ '(' $# -lt 2 ')' -o '(' $# -gt 3 ')' ]
From the info page:
`test'
`['
test EXPR
Evaluate a conditional express ion EXPR and return a status of 0
(true) or 1 (false). Each operator and operand must be a separate
argument.
By the way, the expression could be rewritten as follows:
if builtin test \( $# -lt 2 \) -o \( $# -gt 3 \)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With