在Shell脚本中使用带空格的路径

时间:2013-01-11 11:13:08

标签: java shell unix

我使用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”类未找到异常。如何解决此问题。任何建议或帮助都会非常明显。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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。所有文件&amp;其中的目录结构将被保留。

答案 2 :(得分:0)

该脚本在与命令eval一起使用时起作用,该命令保留引号并且它添加任何额外的单引号。

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