diff --git a/src/parser.c b/src/parser.c
index e891d31..1cfee0a 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -775,7 +775,8 @@ xxreadtoken(void)
 			continue;
 		case '\\':
 			if (pgetc() == '\n') {
-				startlinno = ++plinno;
+			  	setvarint("LINENO", plinno++, 0);
+			        startlinno = plinno;
 				if (doprompt)
 					setprompt(2);
 				continue;
@@ -783,7 +784,7 @@ xxreadtoken(void)
 			pungetc();
 			goto breakloop;
 		case '\n':
-			plinno++;
+		  	setvarint("LINENO", plinno++, 0);
 			needprompt = doprompt;
 			RETURN(TNL);
 		case PEOF:
@@ -885,7 +886,7 @@ readtoken1(int firstc, char const *syntax, char *eofmark, int striptabs)
 				if (syntax == BASESYNTAX)
 					goto endword;	/* exit outer loop */
 				USTPUTC(c, out);
-				plinno++;
+				setvarint("LINENO", plinno++, 0);
 				if (doprompt)
 					setprompt(2);
 				c = pgetc();
@@ -1065,7 +1066,7 @@ checkend: {
 
 		if (c == '\n' || c == PEOF) {
 			c = PEOF;
-			plinno++;
+			setvarint("LINENO", plinno++, 0);
 			needprompt = doprompt;
 		} else {
 			int len;
@@ -1315,7 +1316,7 @@ parsebackq: {
 
 			case '\\':
                                 if ((pc = pgetc()) == '\n') {
-					plinno++;
+				        setvarint("LINENO", plinno++, 0);
 					if (doprompt)
 						setprompt(2);
 					/*
@@ -1340,7 +1341,7 @@ parsebackq: {
 				synerror("EOF in backquote substitution");
 
 			case '\n':
-				plinno++;
+			        setvarint("LINENO", plinno++, 0);
 				needprompt = doprompt;
 				break;
 
diff --git a/src/var.c b/src/var.c
index 7f9af9c..ee542a0 100644
--- a/src/var.c
+++ b/src/var.c
@@ -90,6 +90,7 @@ struct var varinit[] = {
 	{ 0,	VSTRFIXED|VTEXTFIXED,		"PS2=> ",	0 },
 	{ 0,	VSTRFIXED|VTEXTFIXED,		"PS4=+ ",	0 },
 	{ 0,	VSTRFIXED|VTEXTFIXED,		"OPTIND=1",	getoptsreset },
+	{ 0,	VSTRFIXED|VTEXTFIXED|VUNSET,	"LINENO\0",	0 },
 #ifndef SMALL
 	{ 0,	VSTRFIXED|VTEXTFIXED|VUNSET,	"TERM\0",	0 },
 	{ 0,	VSTRFIXED|VTEXTFIXED|VUNSET,	"HISTSIZE\0",	sethistsize },
