我正在使用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设置echo时,我看到shell将其转换为

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


遇到空格时在其中添加单引号的地方,但出现“ / To”类未找到异常。如何解决这个问题。任何建议或帮助将是非常可观的。

最佳答案

尝试这个:

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

关于java - 在Shell脚本中使用带空格的路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14276961/

10-10 17:51