This patch adds a unary -v operator to test/[/[[ to check if a variable is set, like in ksh93, bash and zsh.
I don't know if I've done this right. All I can say is it works for me. The one thing I haven't got working is foo[2]=bar [[ -v foo[2] ]] I haven't figured out how to get it to parse array subscripts. Any pointers appreciated. Thanks, - M.
Index: funcs.c =================================================================== RCS file: /cvs/src/bin/mksh/funcs.c,v retrieving revision 1.331 diff -u -r1.331 funcs.c --- funcs.c 22 Mar 2017 00:21:06 -0000 1.331 +++ funcs.c 25 Mar 2017 14:20:09 -0000 @@ -202,6 +202,7 @@ {"-S", TO_FILSOCK }, {"-t", TO_FILTT }, {"-u", TO_FILSETU }, + {"-v", TO_ISSET }, {"-w", TO_FILWR }, {"-x", TO_FILEX }, {"-z", TO_STZER }, @@ -3147,6 +3148,17 @@ return (0); return (i == '?' ? 1 : i == '!' ? !Flag(k) : Flag(k)); + /* -v */ + case TO_ISSET: + { + struct tbl *vp; + + for (varsearch(e->loc, &vp, opnd1, hash(opnd1)); vp; vp = vp->u.array) + if (vp->flag & ISSET) + return (1); + return (0); + } + /* -r */ case TO_FILRD: /* LINTED use of access */ Index: sh.h =================================================================== RCS file: /cvs/src/bin/mksh/sh.h,v retrieving revision 1.797 diff -u -r1.797 sh.h --- sh.h 22 Mar 2017 00:21:18 -0000 1.797 +++ sh.h 25 Mar 2017 14:20:09 -0000 @@ -2348,7 +2348,7 @@ /* non-operator */ TO_NONOP = 0, /* unary operators */ - TO_STNZE, TO_STZER, TO_OPTION, + TO_STNZE, TO_STZER, TO_OPTION, TO_ISSET, TO_FILAXST, TO_FILEXST, TO_FILREG, TO_FILBDEV, TO_FILCDEV, TO_FILSYM, TO_FILFIFO, TO_FILSOCK,