Pass contents of file as argument to bash script
Solution 1
Three variations:
- Pass the contents of the file on the command line, then use that in the script.
- Pass the filename of the file on the command line, then read from the file in the script.
- Pass the contents of the file on standard input, then read standard input in the script.
Passing the contents as a command line argument:
$ ./script.sh "$(<some_file)"
Inside the script:
some_data=$1
$1
will be the value of the first command line argument.
This would fail if you have too much data (the command that the shell would have to execute would grow too big).
Passing the filename:
$ ./script.sh some_file
Inside the script:
some_data=$(<"$1")
or
IFS= read -r some_data <"$1"
Connecting standard input to the file:
$ ./script.sh <some_file
Inside the script:
IFS= read -r some_data
The downside with this way of doing it is that the standard input of the script now is connected to some_file
. It does however provide a lot of flexibility for the user of the script to pass the data on standard input from a file or from a pipeline.
Solution 2
cat some_file | ./script.sh `xargs`
Solution 3
Using the read
shell-builtin you can read data from stdin
and store the read input to shell variables:
$ echo foo bar baz | read a b c
$ echo $a
foo
$ echo $b
bar
$ echo $c
baz
As you can see, read
splits is input into fields. Where the input is split is determined by the $IFS
variable (the Input Field Seperator). By setting $IFS
to the empty value, input splitting is disabled and you can save a complete line to one variable:
$ echo foo bar baz | IFS= read foo
$ echo $foo
foo bar baz
Related videos on Youtube
Jim
Updated on September 18, 2022Comments
-
Jim over 1 year
In a bash script I want to do the following:
script.sh < some_file
The
some_file
is a file that has 1 single line that I want to pass it as an argument to my bashscript.sh
. How can I do this? -
Kusalananda over 6 yearsSomewhat overkill for a single line.