4

I want to cat all files to one new file in a bash script.

For example there are three files in my dir: - file_a.txt - file b.txt - file(c).txt

When I write the following, it works without problems:

cat "file"*".txt" >> out_file.bak

No I want to make it more flexible/clean by using a variable:

input_files="file"*".txt"
cat $input_files >> out_file.bak

Unfortunately this doesn't work. The question is why? (When I echo input_files and run the command in terminal everything is fine. So why doesn't it work in the bash script?)

3 Answers 3

4

You're missing a $ in the cat command which uses input_files. Try

cat $input_files >> out_file.bak
3
  • That's right, but only part of the problem.
    – Philippos
    Commented Jul 13, 2017 at 12:20
  • My testing did not reveal a problem with whitespace. Commented Jul 13, 2017 at 12:25
  • You are right, excuse me.
    – Philippos
    Commented Jul 13, 2017 at 12:29
3

It depends when you want to do the expansion:

When you define the variable:

$ files=$(echo a*)
$ echo $files
a1 a2 a3
$ echo "$files"
a1 a2 a3

When you access the variable:

$ files=a*
$ echo "$files"
a*
$ echo $files
a1 a2 a3
3

You'll have to take more care if you have filenames containing whitespace. In that case, use an array:

input_files=( "file with space."*.txt )
cat "${input_files[@]}" >> out_file.bak
3
  • +1 this is the better way to store a list of files. Commented Jul 13, 2017 at 19:42
  • But this would also output files named "file with space." (Which is missing the *.txt part). Or does cat know that each part of the array must match?
    – netblognet
    Commented Jul 14, 2017 at 11:05
  • No. cat doesn't "know" anything: the shell expands the glob pattern into the array, so the array contains just a list of filenames. Then the array expansion syntax provides cat with all the filenames. The glob pattern "file with space."*.txt will only match files ending with .txt and beginning with file with space. That's because there are no unquoted spaces in the pattern. Create a few sample files and test it for yourself Commented Jul 14, 2017 at 13:05

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .