5

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?

5
cat some_file | ./script.sh `xargs` 
  • Somewhat overkill for a single line. – Kusalananda Sep 20 '17 at 9:23
4

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.


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.

2

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.