将带引号的参数传递给Shell脚本并保留引号

7

我想要在脚本中将参数作为命令的参数进行执行。以下面的示例为例,我执行了mailx命令。

bash

$./myscript.sh "My quoted Argument"

myscript.sh

mailx -s $1

这最终会被执行为:mailx -s 我的引用参数
  • 我尝试了"$1",但我的引号被丢弃了。(错误陈述,请参阅下面的答案)
  • 我尝试了""$1"",但我的引号被丢弃了。
  • 我尝试使用'$1',但那是强引用,所以$1永远不会被解释。
  • 我知道我可以使用$@,但这会给我每个参数。
  • .... 你懂的

任何帮助都将不胜感激!

3个回答

8

mailx -s "$1"$1 的值正确地传递给 mailx,包括嵌入的空格。

在这种情况下,这意味着 My Quoted Argument 作为一个单独的字面参数传递给 mailx,这可能是您的意图。

在Shell命令行中,字符串文字周围的引号是句法元素,用于标记参数边界,在解析命令行时被Shell删除(这个过程称为去引号)。

如果您真的想要传递嵌入的双引号(这很不寻常),则有两个选项:

  • 第一种:在调用时嵌入引号 ./myscript.sh "\"My quoted Argument\""
  • 第二种:在myscript.sh中嵌入引号:mailx -s "\"$1\""

1
感谢@mklement0。不知何故在我的测试中,当将参数传递给mailx时,我可能忽略了引用脚本中的参数。 - Ryan Griffith

-1

你能试着这样传递参数吗?

$./myscript.sh \"My quoted Argument\"?

1
我希望能够像对待任何普通命令一样传递参数,而不必理解该命令的内部工作原理。也就是说,我不想因为脚本设计的缺陷而修改传递参数的方式。 - Ryan Griffith

-1

在您的脚本中,您可以只在$1周围放置转义引号。

mailx -s \"$1\"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接