> CONDITIONAL EXPRESSIONS
>        Conditional expressions are used by the [[  compound  command  and  the
>        test  and [ builtin commands to test file attributes and perform string
>        and arithmetic comparisons.  Expressions are formed from the  following
>        unary  or  binary  primaries.   If any file argument to one of the pri-
>        maries is of the form /dev/fd/n, then file descriptor n is checked.  If
>        the  file  argument  to  one  of  the  primaries  is one of /dev/stdin,
>        /dev/stdout, or /dev/stderr, file descriptor 0, 1, or 2,  respectively,
>        is checked.
> 
>        Unless otherwise specified, primaries that operate on files follow sym-
>        bolic links and operate on the target of the link, rather than the link
>        itself.
> 
>        -a file
>               True if file exists.
>        ...
>        arg1 OP arg2
>               OP is one of -eq, -ne, -lt, -le, -gt, or -ge.  These  arithmetic
>               binary  operators return true if arg1 is equal to, not equal to,
>               less than, less than or equal to, greater than, or greater  than
>               or  equal  to arg2, respectively.  Arg1 and arg2 may be positive
>               or negative integers.

Okay. The below script shows the issue. It fails for busybox.

#!bin/sh

a=24
b=47

if [[ "$a" -eq 24 && "$b" -eq 47 ]]
then
        echo "Test succeeds"
else
        echo "test fails"
fi

If you apply this patch it works. Basically ash assumes everything in 
between [[ and ]] is a TWORD instead of a conditional. If it does see the 
&& in between [[ and  ]] ash interpites it as a [[ ]] && instead. It does 
a internal translation of && to -a and || to -o.
 
diff -urwN busybox-1.10.0.orig/shell/ash.c busybox-1.10.0/shell/ash.c
--- busybox-1.10.0.orig/shell/ash.c     2008-03-24 12:40:29.000000000 -0400
+++ busybox-1.10.0/shell/ash.c  2008-03-24 12:57:45.000000000 -0400
@@ -10008,7 +10008,7 @@
        union node *n = NULL;
        union node *vars, **vpp;
        union node **rpp, *redir;
-       int savecheckkwd;
+       int savecheckkwd, flag = 0;
 
        args = NULL;
        app = &args;
@@ -10021,11 +10021,24 @@
        for (;;) {
                checkkwd = savecheckkwd;
                switch (readtoken()) {
+               case TAND:
+                       wordtext = (char *) "-a";
+               case TOR:
+                       if (strcmp(wordtext, "&&"))
+                               wordtext = (char *) "-o";
+                       if (!flag) {
+                               tokpushback++;
+                               goto out;
+                       }
                case TWORD:
                        n = stzalloc(sizeof(struct narg));
                        n->type = NARG;
                        /*n->narg.next = NULL; - stzalloc did it */
                        n->narg.text = wordtext;
+                       if (!strcmp("[[", wordtext))
+                               flag = 1;
+                       else if (!strcmp("]]", wordtext))
+                               flag = 0;
                        n->narg.backquote = backquotelist;
                        if (savecheckkwd && isassignment(wordtext)) {
                                *vpp = n;
_______________________________________________
busybox mailing list
busybox@busybox.net
http://busybox.net/cgi-bin/mailman/listinfo/busybox

Reply via email to