I have a script that takes filenames as positional parameters. I perform a few operations on these and then tar them. Currently my script is not working. The echo line is there for debugging purposes.

Please clarify this statement

But when I try to tar with in the script if can file the file I want to tar.


while [[ $# > 0 ]]; do
    files=$files" "\"${key}\"

echo tar -cvf backup.tar $files
tar -cvf backup.tar $files


tar -cvf backup.tar "test.txt"
tar: "test.txt": Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

I am using the double quotes around the filename (test.txt) as I want to handle files with spaces.

If I were to remove the quotes in the script (\"), it will work but then I can’t handle filenames with spaces.

Any ideas?

  • 1
    Why not just pass the file params directly to tar? tar -cvf backup.tar "$@" ?
    – B Layer
    Oct 14, 2017 at 0:29
  • what about: files="$files \"${key}\""? Or use an array...files+=("$key") and then tar -cvf backup.tar ${files[@]}
    – jesse_b
    Oct 14, 2017 at 0:32
  • See But what if …? Oct 14, 2017 at 0:38
  • Wouldn't he need the $files variable in the tar statement unquoted though? Otherwise, wont they be treated as one argument?
    – jesse_b
    Oct 14, 2017 at 0:44
  • Use capital letters.
    – peterh
    Oct 14, 2017 at 1:34

1 Answer 1


If you are always using all the params then just call tar like this: tar -cvf backup.tar "$@". Otherwise, if you are selecting a subset (though you don't show it) then build up the file list in an array like this:

declare -a files
while [[ $# > 0 ]]; do
    # assume some filtering goes on here

tar -cvf backup.tar "${files[@]}"
  • excellent this work using the array and quoting when adding to the array. Thanks a million. Oct 14, 2017 at 1:09

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