将带有单引号和双引号的参数传递给 shell 脚本

地理

我们试图将带有单引号和双引号的参数传递给 shell 脚本并使用该参数执行。在回显它的打印正确但对于命令我们得到“未终止的引用值”

请参阅脚本和参数传递方法:

[root@geopc]/root# ./myscript.sh 'localhost:9199/jmxrmi -O java.lang:type=GarbageCollector,name="PS MarkSweep" -A CollectionCount -K duration'


#!/bin/bash
out=`/usr/lib64/nagios/plugins/check_jmx -U service:jmx:rmi:///jndi/rmi://$1`
echo $1
echo $out

执行后,我们得到的输出为

$1 : localhost:9199/jmxrmi -O java.lang:type=GarbageCollector,name="PS MarkSweep" -A CollectionCount -K 持续时间

$out : JMX CRITICAL 未终止的引用值

在 Shell Script 中,我们硬编码 $1 的值,然后执行我们得到正确的结果。

我们尝试如下传递参数:

./myscript.sh 'localhost:9199/jmxrmi -O java.lang:type=GarbageCollector,name=\"PS MarkSweep\" -A CollectionCount -K duration'

在这种情况下错误是:JMX CRITICAL Invalid character '"' in value part of property

./myscript.sh 'localhost:9199/jmxrmi -O java.lang:type=GarbageCollector,name="\"PS MarkSweep\"" -A CollectionCount -K duration'

在这种情况下,错误是 JMX CRITICAL 未终止的引用值

所以请任何人帮助我。

那个家伙

问题是您期望变量中的引号和转义符与脚本中的引号解释相同。

在 Java 术语中,这与期望相同:

String input="\"foo\", \"bar\"";
String[] parameters = { input };

与此相同:

String[] parameters = { "foo", "bar" };

两种语言的真正解决方案是让输入为元素数组:

#!/bin/bash
out=`/usr/lib64/nagios/plugins/check_jmx -U service:jmx:rmi:///jndi/rmi://"$1" "${@:2}"`
echo "$1"
echo "$out"

然后运行:

./myscript.sh localhost:9199/jmxrmi -O java.lang:type=GarbageCollector,name="PS MarkSweep" -A CollectionCount -K duration

然而!!

这需要纪律和理解。

您会注意到这不是一个简单的解决方案:现在正在使用多个参数调用脚本。这是一个非常严格的要求。如果这个脚本被另一个程序调用,那个程序也必须意识到这一点。它需要端到端处理。

例如,如果您将其存储在配置文件中,则您有责任以可以反序列化为列表的方式序列化字符串。你不能只是希望它会成功,因为它不会。与 Java 不同的是,当您混淆字符串和列表时,不会有编译器警告。

如果这不是您想要参与的事情,您可以改用eval. 由于安全性和健壮性问题,这是一种不好的做法,但有时它已经足够了:

yourcommand="/usr/lib64/nagios/plugins/check_jmx -U service:jmx:rmi:///jndi/rmi://$1"
echo "$yourcommand"  # Make sure this writes the right command
eval "$yourcommand"  # This will execute it as if you copy-pasted it

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将带有引号和双引号的参数传递给bash脚本

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

循环shell脚本参数并将带引号的参数传递给函数

如何将包含双引号的参数传递给Shell脚本函数?

将带有空格和引号的参数传递给脚本(不引用所有内容)

gawk和Shell脚本的单引号问题

Shell脚本单引号问题

Bash shell脚本。变量作为参数。无引号与双引号

从Shell脚本中将带有空格的参数传递给命令?

通过TeamCity将带有引号的参数传递给PowerShell脚本

Bash脚本,带有带单引号和双引号的命令

bash脚本执行命令带有双引号,单引号和空格

awk shell脚本来处理带有双引号的csv文件

Groovy:Jenkinsfile:无法将带有空格的参数传递给詹金斯管道中的shell脚本

在Apple脚本中添加双引号(“)以执行shell脚本

为什么在Shell脚本中使用双引号和反引号?

如何在脚本中将带有特殊字符的字符串传递给shell命令?

Shell脚本-不要添加引号

为什么此Shell脚本在命令中插入单引号?

Jenkins在bash shell脚本中添加单引号

在shell脚本中的变量中转义双引号

如何在shell脚本中的行中添加双引号?

如何在shell脚本中使用双引号传递变量值

将命名参数传递给Shell脚本

气流参数传递给Shell脚本

将参数传递给Shell脚本

Shell脚本Bash,检查字符串是否以单引号开头和结尾

执行带有双引号的cmd脚本

如何修复在命令行工作的 shell 脚本?脚本使用 `mv`、引号、参数扩展和变量