Bash – Pass contents of file as argument to bash script

bashshell-script

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?

Best Answer

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.