diff --git a/src/shell/mod.rs b/src/shell/mod.rs
index e3ab8737919d3da67096a0e8a48ca9de7d7c38b7..7d6b4bdda462377ee2cf7e49b79b82584e7b4261 100644
--- a/src/shell/mod.rs
+++ b/src/shell/mod.rs
@@ -158,52 +158,63 @@ impl<'a> Shell<'a> {
     }
 
     pub fn execute(&mut self) {
-        let mut dash_c = false;
-        for arg in env::args().skip(1) {
-            if arg == "-c" {
-                dash_c = true;
-            } else {
-                if dash_c {
+        let mut args = env::args().skip(1);
+
+        if let Some(path) = args.next() {
+            if path == "-c" {
+                if let Some(arg) = args.next() {
+                    for (i, arg) in args.enumerate() {
+                        self.variables.set_var(&format!("{}", i), &arg);
+                    }
+
                     self.on_command(&arg);
                 } else {
-                    match File::open(&arg) {
-                        Ok(mut file) => {
-                            let capacity = file.metadata().ok().map_or(0, |x| x.len());
-                            let mut command_list = String::with_capacity(capacity as usize);
-                            match file.read_to_string(&mut command_list) {
-                                Ok(_) => {
-                                    let mut lines = command_list.lines().map(|x| x.to_owned());
-                                    while let Some(command) = lines.next() {
-                                        let mut buffer = QuoteTerminator::new(command);
-                                        while !buffer.check_termination() {
-                                            loop {
-                                                if let Some(command) = lines.next() {
-                                                    buffer.append(command);
-                                                    break
-                                                }
+                    let stderr = io::stderr();
+                    let mut stderr = stderr.lock();
+                    let _ = writeln!(stderr, "ion: -c requires an argument");
+                }
+            } else {
+                self.variables.set_var("0", &path);
+                for (i, arg) in args.enumerate() {
+                    self.variables.set_var(&format!("{}", i + 1), &arg);
+                }
+
+                match File::open(&path) {
+                    Ok(mut file) => {
+                        let capacity = file.metadata().ok().map_or(0, |x| x.len());
+                        let mut command_list = String::with_capacity(capacity as usize);
+                        match file.read_to_string(&mut command_list) {
+                            Ok(_) => {
+                                let mut lines = command_list.lines().map(|x| x.to_owned());
+                                while let Some(command) = lines.next() {
+                                    let mut buffer = QuoteTerminator::new(command);
+                                    while !buffer.check_termination() {
+                                        loop {
+                                            if let Some(command) = lines.next() {
+                                                buffer.append(command);
+                                                break
                                             }
                                         }
-                                        self.on_command(&buffer.consume());
                                     }
-                                },
-                                Err(err) => {
-                                    let stderr = io::stderr();
-                                    let mut stderr = stderr.lock();
-                                    let _ = writeln!(stderr, "ion: failed to read {}: {}", arg, err);
+                                    self.on_command(&buffer.consume());
                                 }
+                            },
+                            Err(err) => {
+                                let stderr = io::stderr();
+                                let mut stderr = stderr.lock();
+                                let _ = writeln!(stderr, "ion: failed to read {}: {}", path, err);
                             }
-                        },
-                        Err(err) => {
-                            let stderr = io::stderr();
-                            let mut stderr = stderr.lock();
-                            let _ = writeln!(stderr, "ion: failed to open {}: {}", arg, err);
                         }
+                    },
+                    Err(err) => {
+                        let stderr = io::stderr();
+                        let mut stderr = stderr.lock();
+                        let _ = writeln!(stderr, "ion: failed to open {}: {}", path, err);
                     }
                 }
-
-                // Exit with the previous command's exit status.
-                process::exit(self.previous_status);
             }
+
+            process::exit(self.previous_status);
         }
 
         while let Some(command) = self.readln() {