> 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