0

我正在使用 shell 脚本来调用 java 程序。当调用传递 java 程序时,我传递了 -Dargument,它有一个目录的路径。这个 -D 参数是从文件中读取的。现在,当此路径包含空格时,我面临一个问题。我尝试使用引号和转义引号,但两者都有效。

这是我的 shell 脚本代码 test.sh

   D_ARG=`(tr '\r\n' ' ' < argument.dat)
  \#executing java code by passing above argument
   java ${D_ARG} TestProgram

下面是我的参数文件,argument.dat

  -Dargument1="/Path /To A/File"

当我使用 set -x 设置回显时,我看到 shell 将其转换为

  '-Dargument1="/Path' '/To' 'A/File"'

它在遇到空格时添加单引号并且我得到“/To”类未找到异常。如何解决这个问题。任何建议或帮助都将非常可观。

4

3 回答 3

2

试试这个:

ARGS=

# Do nothing if there are no spaces; if there are spaces, surround with quotes
for arg in $(perl -pe '/ / or next; s/^/"/; s/$/"/' argument.dat); do
    ARGS="$ARGS $arg";
done

java $ARGS TestProgram

这基本上有这样的效果,每行有一个空格,它就会用引号括起来,所以-Da=b c会变成"-Da=b c".

请注意,"-Da=b c"它严格等同于-Da="b c",甚至看起来更怪异的形式:

  • '-Da='b\ c;
  • -D"a=b "c;
  • 等等等等

唯一重要的是输入字段分隔符的任何字符都被转义。是的,这是合法的:

alias l"l=ls"\ -l
于 2013-01-11T11:16:19.560 回答
0

您可能会转义“/Path /To A/File”中的空格。然而,这不是一个好的解决方案,因为很多时候,我们可能会制定一个类似的命令

system(argv[1]);/* Example is  C specific; 
      but you understand the loop-hole imparted by single escaping.
      You may require multilevel escaping, based on your implementation. OR
      We may have to escape the string, every time it is dereferenced.
      */

linux 系统上更好的选择是创建符号链接。

ln -s "/Path /To A/File" /tmp/file

& 然后在参数文件中-Dargument1="/tmp/file"
,如果只有一个文件"/Path /To A/File"有问题,请使用使用这种方法。


另一种方法是使用mount --bind

mkdir /tmp/myfiles && mount --bind "/Path /To A" /tmp/myfiles

& 然后在参数文件中,使用-Dargument1="/tmp/myfiles/File"
这种方法将挂载"/Path /To A"/tmp/myfiles. 将保留其中的所有文件和目录结构。

于 2013-01-11T12:09:27.457 回答
0

The script worked when used with the command eval, Which preserves quotes and it dint add any additional single quotes.

  D_ARG=`(tr '\r\n' ' ' < argument.dat)
 \#executing java code by passing above argument
  eval java ${D_ARG} TestProgram
于 2013-01-11T16:34:09.337 回答