diff --git a/examples/inner_expansions.ion b/examples/inner_expansions.ion
new file mode 100644
index 0000000000000000000000000000000000000000..1526752905d63034833ee44d761d6cb2d302117f
--- /dev/null
+++ b/examples/inner_expansions.ion
@@ -0,0 +1,6 @@
+echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[0] @echo_array[1] @echo_array[2])
+echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[0] @echo_array[2] @echo_array[1])
+echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[1] @echo_array[2] @echo_array[0])
+echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[1] @echo_array[0] @echo_array[2])
+echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[2] @echo_array[1] @echo_array[0])
+echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[2] @echo_array[0] @echo_array[1])
diff --git a/examples/inner_expansions.out b/examples/inner_expansions.out
new file mode 100644
index 0000000000000000000000000000000000000000..7ec6163644e6efcd243ace89eb53bf5408f2acd9
--- /dev/null
+++ b/examples/inner_expansions.out
@@ -0,0 +1,6 @@
+me myself I
+me I myself
+myself I me
+myself me I
+I myself me
+I me myself
diff --git a/src/lib/parser/shell_expand/words/mod.rs b/src/lib/parser/shell_expand/words/mod.rs
index 993a7cbdc284d1561dab58b98128067c5421f7b8..24d686ee968a8a46bd4d3d77adca5f4468cd3bea 100644
--- a/src/lib/parser/shell_expand/words/mod.rs
+++ b/src/lib/parser/shell_expand/words/mod.rs
@@ -254,6 +254,17 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
                 b'"' if !self.flags.contains(Flags::SQUOTE) => self.flags ^= Flags::DQUOTE,
                 b'$' if !self.flags.contains(Flags::SQUOTE) => {
                     if self.data.as_bytes()[self.read + 1] == b'(' {
+                        // Pop out the '(' char
+                        iterator.next();
+                        self.read += 1;
+                        level += 1;
+                    }
+                }
+                b'@' if !self.flags.contains(Flags::SQUOTE) => {
+                    if self.data.as_bytes()[self.read + 1] == b'(' {
+                        // Pop out the '(' char
+                        iterator.next();
+                        self.read += 1;
                         level += 1;
                     }
                 }
diff --git a/src/lib/parser/shell_expand/words/tests.rs b/src/lib/parser/shell_expand/words/tests.rs
index f47e7aa5ff277048540abe2e917b4258aa72bcde..088e26b8b3680cae6cce810e0586d5c5cb676632 100644
--- a/src/lib/parser/shell_expand/words/tests.rs
+++ b/src/lib/parser/shell_expand/words/tests.rs
@@ -94,6 +94,22 @@ fn array_processes() {
     compare(input, expected);
 }
 
+#[test]
+fn array_process_within_string_process() {
+    compare(
+        "echo $(let free=[@(free -h)]; echo @free[6]@free[8]/@free[7])",
+        vec![
+            WordToken::Normal("echo", false, false),
+            WordToken::Whitespace(" "),
+            WordToken::Process(
+                "let free=[@(free -h)]; echo @free[6]@free[8]/@free[7]",
+                false,
+                Select::All
+            )
+        ]
+    )
+}
+
 #[test]
 fn indexes() {
     let input = "@array[0..3] @array[0...3] @array[abc] @array[..3] @array[3..]";