I use the command:

cm1 cm2 arg1 arg2 'argument 3'

It first goes to cm1, which will then redirect arg1 arg2 'argument 3' to another file.


#! /bin/bash
# some script here
cm2 $@


echo $#
# This returns 4 in lieu of 3 because the white space in 'argument 3' causes the argument to be split into two arguments.

So, how can I pass arguments from one script to another and make sure white space won't be read as an argument separator?


I assume you have to re-wrap it into quotes, like so:

#! /bin/bash
# some script here
cm2 "$@"
|improve this answer|||||
  • Thanks! It works on the simple example I gave. Now on the real script I am coding and that has more complex rerouting, arguments get broken at some point. But that means the error is coming from somewhere else... Thanks! – François ッ Vespa ت Mar 13 '12 at 10:30
  • It may be that you split these args later based on default IFS which default value is "<space><tab><newline>" – Cougar Mar 14 '12 at 9:48
  • I was looking for opposite behavior - how to force my script to iterate over arguments separated with spaces. In my script I had quoted reference ("$@") so all arguments were treated as one concatenated string. I replaced: >for path in "$@"< with: >for path in $@< and it worked. Thank you. – mombip Nov 7 '18 at 11:23

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.