0

我在将“$*”传递给 java 编译程序时遇到了一个奇怪的问题。当我从以下命令行传递变量时,程序不会解析变量:

/export/home/checkout>/tmp/jsnmp.sh -f noc2 -t 4,4 -x \"resdiag SilentDiag 1\",18

“/tmp/jsnmp.sh”包含以下内容:

#!/bin/sh

$JAVA_HOME/bin/java -jar /export/home/checkout/jsnmp.jar $*

现在如果我运行这个:

$JAVA_HOME/bin/java -jar /export/home/checkout/jsnmp.jar \
     -f noc2 -t 4,4 -x "resdiag SilentDiag 1",18

一切正常。

有什么想法吗?

4

2 回答 2

1

您可能希望在脚本中保留引用,因此请使用"$@".

于 2013-05-01T19:21:45.947 回答
0

这与 Java 或 Solaris 无关,这纯粹是 shell 的东西。

这是因为在 $* 替换参数之后将被重新解析并成为单独的参数。例如,您的 java 可执行文件将其视为

-f noc2 -t 4,4 -x resdiag SilentDiag 1,18

或类似的东西。

查看以下测试代码:

灰:

echo $1
echo $2
echo $3
./b.sh $*

b.sh:

echo b
echo $1
echo $2
echo $3

运行它将产生以下输出:

$ ./a.sh "1 2" 3
1 2
3

b
1
2
3

看看第一个脚本有 2 个参数,第二个脚本有 3 个参数。

将 $* 括在双引号中将无济于事,因为它将所有参数作为一个参数发送。

以下应该有效:

#!/bin/sh

$JAVA_HOME/bin/java -jar /export/home/checkout/jsnmp.jar "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"

不过,您将有一些最大数量的参数...

于 2013-05-01T22:09:26.560 回答