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,

Reply via email to