Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将带单引号和双引号的参数传递给shell脚本_Linux_Bash_Shell - Fatal编程技术网

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

Linux 将带单引号和双引号的参数传递给shell脚本,linux,bash,shell,Linux,Bash,Shell,我们试图将带有单引号和双引号的参数传递给shell脚本,并使用此参数执行。在echo中,它的打印正确,但对于命令,我们得到的是“Unterminated quoted value” 请参阅脚本和参数传递方法: [root@geopc]/root# ./myscript.sh 'localhost:9199/jmxrmi -O java.lang:type=GarbageCollector,name="PS MarkSweep" -A CollectionCount -K duration'

我们试图将带有单引号和双引号的参数传递给shell脚本,并使用此参数执行。在echo中,它的打印正确,但对于命令,我们得到的是“Unterminated quoted value”

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

[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-ojava.lang:type=GarbageCollector,name=“PS MarkSweep”-一个CollectionCount-K持续时间

$out:JMX临界未终止引用值

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

我们尝试传递如下论点:

./myscript.sh 'localhost:9199/jmxrmi -O java.lang:type=GarbageCollector,name=\"PS MarkSweep\" -A CollectionCount -K duration'
在这种情况下,错误是:JMX关键属性的值部分中的无效字符''''

./myscript.sh 'localhost:9199/jmxrmi -O java.lang:type=GarbageCollector,name="\"PS MarkSweep\"" -A CollectionCount -K duration'
在这种情况下,错误是JMX临界未终止引用值


因此,请大家帮我解决这个问题。

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

在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

您是否尝试过作为单个参数传递,并在调用中使用$@或$*呢?问题不在于传递参数,而在于在脚本中正确解释该参数。脚本在一定程度上涵盖了您在脚本中尝试执行的操作。