Pass contents of file as argument to bash script

53,371

Solution 1

Three variations:

  1. Pass the contents of the file on the command line, then use that in the script.
  2. Pass the filename of the file on the command line, then read from the file in the script.
  3. 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
Share:
53,371

Related videos on Youtube

Jim
Author by

Jim

Updated on September 18, 2022

Comments

  • Jim
    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 bash script.sh. How can I do this?

  • Kusalananda
    Kusalananda over 6 years
    Somewhat overkill for a single line.