diff --git a/src/parse_util.rs b/src/parse_util.rs index 552f3224c..e10839b95 100644 --- a/src/parse_util.rs +++ b/src/parse_util.rs @@ -227,13 +227,16 @@ fn process_opening_quote( inout_is_quoted: &mut Option<&mut bool>, paran_count: i32, quoted_cmdsubs: &mut Vec, - pos: usize, + mut pos: usize, last_dollar: &mut Option, quote: Quote, ) -> Option { let quote = match quote { Quote::Real(q) => q, - Quote::VirtualDouble => '"', + Quote::VirtualDouble => { + pos = pos.saturating_sub(1); + '"' + } }; let q_end = quote_end(input.into(), pos, quote)?; // Found a valid closing quote. @@ -266,7 +269,7 @@ fn process_opening_quote( &mut last_dollar, Quote::VirtualDouble, ) - .unwrap_or(input.len()); + .map_or(input.len(), |pos| pos + 1); } while pos < input.len() { diff --git a/src/tests/parse_util.rs b/src/tests/parse_util.rs index a1d67ad1a..86e64d138 100644 --- a/src/tests/parse_util.rs +++ b/src/tests/parse_util.rs @@ -439,5 +439,10 @@ macro_rules! validate { 0, r#"echo "$()"'"#, 0, "\n" ); + validate!( + 0, r#"""#, + 0, "\n", + 0, r#"$()"$() ""# + ); })(); }