How do I pass on script arguments that contain quotes/spaces?
Use "$@"
with quotes:
prog="$1""$@"ecode="$?"echo "$prog exited with $ecode"
This will pass each argument exactly as it was received. If you don't include the quotes, each element will be split according to $IFS
:
"$@"
is like"$1" "$2" "$3" ...
, passing each element as a separate argument."$*"
is like"$1 $2 $3 ..."
, passing all elements concatenated as a single argument$*
and$@
is like$1 $2 $3 ...
, breaking up each element on whitespace, expanding all globs, and passing each resulting word as a separate element ($IFS
).
The same is true for arrays, such as "${array[@]}"
and "${array[*]}"
Put double-quotes around your variable substitutions to keep them from being parsed (note that this applies to all variables: $@
, $1
, and $PROG
). Also: don't put a $ before a variable name when assigning to it; use #
for comments; and, on the last line, the single-quotes will prevent variables from being substituted at all.
PROG="$1"shift# Run program below"$PROG" "$@"ECODE=$? # note: this will always be a number, so it doesn't have to be protected with double-quotesecho -e "Subject: $(hostname): $PROG finished\r\nTo: <$USER>\r\n\r\nExited with $ECODE\r\n' | sendmail "$USER"