Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to echo "$@" so the result is valid bash and maintains proper quoting?

Tags:

bash

What do I put in wrapper.sh, if I want this:

wrapper.sh "hello world" arg2 '' "this ' thing"

to output:

Now please run:
other-command "hello world" arg2 '' "this ' thing"

I realize and am fine with that the original quotation is lost and the output perhaps will be quoted differently, as long as other-command gets the correct parameters when the command is cut'n'pasted to the shell.

I'm aware of "$@" which works well for calling other programs, but not for echoing valid bash to STDOUT as far as I can tell.

This looks pretty nice but requires Perl and String::ShellQuote (which I'd like to avoid):

$ perl -MString::ShellQuote -E 'say shell_quote @ARGV' other-command "hello world" arg2 '' "this ' thing"
other-command 'hello world' arg2 '' 'this '\'' thing'

This doesn't work - notice how the zero-length arg is missing:

$ perl -E 'say join(" ", map { quotemeta $_ } @ARGV)' other-command "hello world" arg2 '' "this ' thing"
other\-command hello\ world arg2  this\ \'\ thing

again, I'd like to avoid using Perl or Python...

like image 575
Peter V. Mørch Avatar asked Jan 22 '21 12:01

Peter V. Mørch


People also ask

What does $@ do in bash script?

bash [filename] runs the commands saved in a file. $@ refers to all of a shell script's command-line arguments. $1 , $2 , etc., refer to the first command-line argument, the second command-line argument, etc. Place variables in quotes if the values might have spaces in them.

How do you echo the output of a command?

The echo command writes text to standard output (stdout). The syntax of using the echo command is pretty straightforward: echo [OPTIONS] STRING... Some common usages of the echo command are piping shell variable to other commands, writing text to stdout in a shell script, and redirecting text to a file.

How do you echo double quotes in shell script?

A double quote may be quoted within double quotes by preceding it with a backslash. If enabled, history expansion will be performed unless an '! ' appearing in double quotes is escaped using a backslash. The backslash preceding the '!


2 Answers

You can use the @Q parameter transformation.

$ set -- "hello world" arg2 '' 'this " thing'
$ echo other-command "${@@Q}"
other-command 'hello world' 'arg2' '' 'this " thing'
like image 134
oguz ismail Avatar answered Nov 07 '22 07:11

oguz ismail


If you intend the output to be re-evalulated, then you need to printf "%q". You script could look like:

echo Now please run:
echo "other-command$(printf " %q" "$@")"
like image 35
KamilCuk Avatar answered Nov 07 '22 07:11

KamilCuk