diff --git a/cmd/root.go b/cmd/root.go
index 377869e6bd6962036e1c1d4378bb86bbd63c3543..073805f0ac48292161519ed5a954db23fed1b89d 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -5,6 +5,7 @@ import (
 	"encoding/json"
 	goflag "flag"
 	"fmt"
+	"io/ioutil"
 	"net/http"
 	"os"
 	"path/filepath"
@@ -25,6 +26,9 @@ import (
 const (
 	flagJpath      = "jpath"
 	flagExtVar     = "ext-str"
+	flagExtVarFile = "ext-str-file"
+	flagTlaVar     = "tla-str"
+	flagTlaVarFile = "tla-str-file"
 	flagResolver   = "resolve-images"
 	flagResolvFail = "resolve-images-error"
 )
@@ -34,6 +38,9 @@ var clientConfig clientcmd.ClientConfig
 func init() {
 	RootCmd.PersistentFlags().StringP(flagJpath, "J", "", "Additional jsonnet library search path")
 	RootCmd.PersistentFlags().StringSliceP(flagExtVar, "V", nil, "Values of external variables")
+	RootCmd.PersistentFlags().StringSlice(flagExtVarFile, nil, "Read external variable from a file")
+	RootCmd.PersistentFlags().StringSliceP(flagTlaVar, "A", nil, "Values of top level arguments")
+	RootCmd.PersistentFlags().StringSlice(flagTlaVarFile, nil, "Read top level argument from a file")
 	RootCmd.PersistentFlags().String(flagResolver, "noop", "Change implementation of resolveImage native function. One of: noop, registry")
 	RootCmd.PersistentFlags().String(flagResolvFail, "warn", "Action when resolveImage fails. One of ignore,warn,error")
 
@@ -90,10 +97,68 @@ func JsonnetVM(cmd *cobra.Command) (*jsonnet.VM, error) {
 	}
 	for _, extvar := range extvars {
 		kv := strings.SplitN(extvar, "=", 2)
+		switch len(kv) {
+		case 1:
+			v, present := os.LookupEnv(kv[0])
+			if present {
+				vm.ExtVar(kv[0], v)
+			} else {
+				return nil, fmt.Errorf("Missing environment variable: %s", kv[0])
+			}
+		case 2:
+			vm.ExtVar(kv[0], kv[1])
+		}
+	}
+
+	extvarfiles, err := flags.GetStringSlice(flagExtVarFile)
+	if err != nil {
+		return nil, err
+	}
+	for _, extvar := range extvarfiles {
+		kv := strings.SplitN(extvar, "=", 2)
+		if len(kv) != 2 {
+			return nil, fmt.Errorf("Failed to parse %s: missing '=' in %s", flagExtVarFile, extvar)
+		}
+		v, err := ioutil.ReadFile(kv[1])
+		if err != nil {
+			return nil, err
+		}
+		vm.ExtVar(kv[0], string(v))
+	}
+
+	tlavars, err := flags.GetStringSlice(flagTlaVar)
+	if err != nil {
+		return nil, err
+	}
+	for _, tlavar := range tlavars {
+		kv := strings.SplitN(tlavar, "=", 2)
+		switch len(kv) {
+		case 1:
+			v, present := os.LookupEnv(kv[0])
+			if present {
+				vm.TlaVar(kv[0], v)
+			} else {
+				return nil, fmt.Errorf("Missing environment variable: %s", kv[0])
+			}
+		case 2:
+			vm.TlaVar(kv[0], kv[1])
+		}
+	}
+
+	tlavarfiles, err := flags.GetStringSlice(flagTlaVarFile)
+	if err != nil {
+		return nil, err
+	}
+	for _, tlavar := range tlavarfiles {
+		kv := strings.SplitN(tlavar, "=", 2)
 		if len(kv) != 2 {
-			return nil, fmt.Errorf("Failed to parse extvar: missing '=' in %s", extvar)
+			return nil, fmt.Errorf("Failed to parse %s: missing '=' in %s", flagTlaVarFile, tlavar)
+		}
+		v, err := ioutil.ReadFile(kv[1])
+		if err != nil {
+			return nil, err
 		}
-		vm.ExtVar(kv[0], kv[1])
+		vm.TlaVar(kv[0], string(v))
 	}
 
 	resolver, err := buildResolver(cmd)
diff --git a/cmd/show_test.go b/cmd/show_test.go
index a715d8ad69eb1a7b20e86df80ec9ef5b4942cfdc..aa6582236782ffe7c3f1754e8519ffa2ceb834f8 100644
--- a/cmd/show_test.go
+++ b/cmd/show_test.go
@@ -3,6 +3,7 @@ package cmd
 import (
 	"bytes"
 	"encoding/json"
+	"os"
 	"path/filepath"
 	"reflect"
 	"testing"
@@ -46,6 +47,8 @@ func TestShow(t *testing.T) {
   "number": 42,
   "string": "bar",
   "notAVal": "aVal",
+  "notAnotherVal": "aVal2",
+  "filevar": "foo\n",
   "array": ["one", 2, [3]],
   "object": {"foo": "bar"}
 }
@@ -57,11 +60,16 @@ func TestShow(t *testing.T) {
 			t.Errorf("error parsing *expected* value: %s", err)
 		}
 
+		os.Setenv("anVar", "aVal2")
+		defer os.Unsetenv("anVar")
+
 		output := cmdOutput(t, []string{"show",
 			"-J", filepath.FromSlash("../testdata/lib"),
 			"-o", format,
 			filepath.FromSlash("../testdata/test.jsonnet"),
 			"-V", "aVar=aVal",
+			"-V", "anVar",
+			"--ext-str-file", "filevar=" + filepath.FromSlash("../testdata/extvar.file"),
 		})
 
 		t.Log("output is", output)
diff --git a/testdata/extvar.file b/testdata/extvar.file
new file mode 100644
index 0000000000000000000000000000000000000000..257cc5642cb1a054f08cc83f2d943e56fd3ebe99
--- /dev/null
+++ b/testdata/extvar.file
@@ -0,0 +1 @@
+foo
diff --git a/testdata/test.jsonnet b/testdata/test.jsonnet
index d0cd6a7f2ed8cdcbac66a0999ebcd83aaf948e4a..0d5887e224eb44e76e999858cca2fceb22e03c18 100644
--- a/testdata/test.jsonnet
+++ b/testdata/test.jsonnet
@@ -1,5 +1,7 @@
 local test = import "test.libsonnet";
 local aVar = std.extVar("aVar");
+local anVar = std.extVar("anVar");
+local filevar = std.extVar("filevar");
 
 {
   apiVersion: "v1",
@@ -8,6 +10,8 @@ local aVar = std.extVar("aVar");
     test {
       string: "bar",
       notAVal : aVar,
+      notAnotherVal : anVar,
+      filevar : filevar,
     }
   ],
 }