diff --git a/src/parser/statement/splitter.rs b/src/parser/statement/splitter.rs
index 9aa54a1bae10da9dfc8b869c59980938d77e7f0a..50218c42b6cc9efcc3100b3516152d8674685bd8 100644
--- a/src/parser/statement/splitter.rs
+++ b/src/parser/statement/splitter.rs
@@ -94,8 +94,8 @@ impl<'a> Iterator for StatementSplitter<'a> {
                 _ if self.flags.contains(POST_MATHEXPR) => {
                     self.flags -= POST_MATHEXPR;
                 },
-                // [^A-Za-z0-9_}]
-                0...47 | 58...64 | 91...94 | 96 | 123...124 | 126...127 if self.flags.contains(VBRACE) => {
+                // [^A-Za-z0-9_:}]
+                0...47 | 59...64 | 91...94 | 96 | 123...124 | 126...127 if self.flags.contains(VBRACE) => {
                     // If we are just ending the braced section continue as normal
                     if error.is_none() {
                         error = Some(StatementError::InvalidCharacter(character as char, self.read))
diff --git a/src/shell/variables.rs b/src/shell/variables.rs
index 9d429524fdb4ecd8a27196e1b6b63efb4b93f204..61d148590c8399cb507428faf96b47efd4189638 100644
--- a/src/shell/variables.rs
+++ b/src/shell/variables.rs
@@ -143,9 +143,19 @@ impl Variables {
     pub fn unset_array(&mut self, name: &str) -> Option<Array> { self.arrays.remove(name) }
 
     pub fn get_var(&self, name: &str) -> Option<Value> {
-        self.variables.get(name).cloned().or_else(|| {
-            env::var(name).map(Into::into).ok()
-        })
+        if let Some((namespace, variable)) = name.find("::").map(|pos| (&name[..pos], &name[pos+2..])) {
+            match namespace {
+                "env" => env::var(variable).map(Into::into).ok(),
+                _ => {
+                    eprintln!("ion: unsupported namespace: '{}'", namespace);
+                    None
+                }
+            }
+        } else {
+            self.variables.get(name).cloned().or_else(|| {
+                env::var(name).map(Into::into).ok()
+            })
+        }
     }
 
     pub fn get_var_or_empty(&self, name: &str) -> Value { self.get_var(name).unwrap_or_default() }
@@ -284,7 +294,6 @@ mod tests {
         }
     }
 
-
     #[test]
     fn undefined_variable_expands_to_empty_string() {
         let variables = Variables::default();