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,