【问题标题】:Bash stripping quotes - how to preserve quotes [duplicate]Bash剥离引号-如何保留引号[重复]
【发布时间】:2015-01-06 20:18:29
【问题描述】:

我需要将 cmd 参数传递给我的 bash 脚本,但它一直在去掉引号。

下面是一个例子。在我的脚本中,我添加了一些额外的处理,在处理命令之前我将数据添加到我的第一个变量

$> ./test.sh -t some.comman -extraswitch "some addtional info"

脚本使用 Java 进行一些处理,但“一些附加信息”缺少引号,因此无法执行该脚本的 Java 部分。如何保留命令行中的引号,以便在脚本中执行 Java 命令?

脚本中的 Java 命令

java $JAVA_OPTS "$@"

输出

java lib -someoption -anotheroption -javalibswitch some additional info 

预期输出

java lib -someoption -anotheroption -javalibswitch "some additional info"

【问题讨论】:

  • $> ./test.sh -t some.comman -extraswitch '"some addtional info"' 应该这样做
  • "$@" 正确地将参数传递给java。您的 java 程序以何种方式无法处理其参数?
  • 请准确分享您在脚本中所做的事情。如果您正在使用参数或使用 shell 函数定义,上述命令的行为会有所不同。
  • 使用反斜杠"\"stuff\""
  • 由于您显示的调用与您声称不起作用的java 命令行不匹配,我认为您的问题在于JAVA_OPTS,而不是$@

标签: java bash shell env


【解决方案1】:

你可以像这样传递参数

./test.sh -t some.comman -extraswitch \"some addtional info\"

【讨论】:

  • 这绝对是一个糟糕的答案:test.sh 将看到 6 个参数:-tsome.comman-extraswitch"someaddtionalinfo"
  • 你应该编辑你的答案是:./test.sh -t some.comman -extraswitch "\"some addtional info\""
  • 我必须通过 crontab 调用这个脚本。我有多个 crontab 条目,看起来像我的示例,我必须将完整的 cmd 字符串传递给 java 才能执行。我试图避免在每个 crontab 条目上硬转义引号,即“\”,因为我想要一种更通用的方式将包括引号在内的值传递给 java。引用的部分主要是由 java 处理的附加 sql,这就是为什么我需要传递引号,否则我们将不得不对我们的独立 java 作业进行大量返工。
【解决方案2】:

当你想用引号引用字符串时,我通常使用单引号来避免 shell 插值。

./test.sh -t some.comman -extraswitch '"some addtional info"'

【讨论】:

  • 我宁愿让我的脚本处理报价,而不是我更改所有 crontab 条目。
  • 这样不行。 shell 在这些引号进入运行脚本的进程之前会去除它们。如果您希望将文字引用传递给脚本,则必须引用该引用。
猜你喜欢
  • 1970-01-01
  • 2021-11-11
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
相关资源
最近更新 更多