Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
153 views
in Technique[技术] by (71.8m points)

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

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...

question from:https://stackoverflow.com/questions/65844941/how-to-echo-so-the-result-is-valid-bash-and-maintains-proper-quoting

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can use the @Q parameter transformation.

$ set -- "hello world" arg2 '' 'this " thing'
$ echo other-command "${@@Q}"
other-command 'hello world' 'arg2' '' 'this " thing'

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...