diff --git a/job.c b/job.c
index 59e945a0..954c0c9f 100644
--- a/job.c
+++ b/job.c
@@ -1241,9 +1241,12 @@ construct_command_argv_internal (line, restp, shell, ifs)
 
       if (instring)
 	{
-	  /* Inside a string, just copy any char except a closing quote.  */
+	  /* Inside a string, just copy any char except a closing quote
+	     or a backslash-newline combination.  */
 	  if (*p == '\'')
 	    instring = 0;
+	  else if (*p == '\\' && p[1] == '\n')
+	    goto swallow_escaped_newline;
 	  else if (*p == '\n' && restp != NULL)
 	    {
 	      /* End of the command line.  */
@@ -1275,6 +1278,8 @@ construct_command_argv_internal (line, restp, shell, ifs)
 	    /* Backslash-newline combinations are eaten.  */
 	    if (p[1] == '\n')
 	      {
+	      swallow_escaped_newline:
+
 		/* Eat the backslash, the newline, and following whitespace,
 		   replacing it all with a single space.  */
 		p += 2;
@@ -1286,13 +1291,18 @@ construct_command_argv_internal (line, restp, shell, ifs)
 		if (*p == '\t')
 		  strcpy (p, p + 1);
 
-		if (ap != new_argv[i])
-		  /* Treat this as a space, ending the arg.
-		     But if it's at the beginning of the arg, it should
-		     just get eaten, rather than becoming an empty arg. */
-		  goto end_of_arg;
+		if (instring)
+		  *ap++ = *p;
 		else
-		  p = next_token (p) - 1;
+		  {
+		    if (ap != new_argv[i])
+		      /* Treat this as a space, ending the arg.
+			 But if it's at the beginning of the arg, it should
+			 just get eaten, rather than becoming an empty arg. */
+		      goto end_of_arg;
+		    else
+		      p = next_token (p) - 1;
+		  }
 	      }
 	    else if (p[1] != '\0')
 	      /* Copy and skip the following char.  */