Java 在Shell脚本中使用带空格的路径
我正在使用shell脚本调用java程序。当调用passing java程序时,我传递的是-Dargument,它有一个指向目录的路径。这个-D参数是从文件中读取的。现在,当此路径包含空格时,我面临一个问题。我试着用引号和转义引号,但都没用 这是我的shell脚本代码test.shJava 在Shell脚本中使用带空格的路径,java,shell,unix,Java,Shell,Unix,我正在使用shell脚本调用java程序。当调用passing java程序时,我传递的是-Dargument,它有一个指向目录的路径。这个-D参数是从文件中读取的。现在,当此路径包含空格时,我面临一个问题。我试着用引号和转义引号,但都没用 这是我的shell脚本代码test.sh D_ARG=`(tr '\r\n' ' ' < argument.dat) \#executing java code by passing above argument java ${D_AR
D_ARG=`(tr '\r\n' ' ' < argument.dat)
\#executing java code by passing above argument
java ${D_ARG} TestProgram
当我使用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=bc
将变成“-Da=bc”
请注意,“-Da=bc”
严格等同于-Da=“bc”
,甚至更奇怪的形式:
李>”-Da='b\c
李>-D“a=b”c
- 等等
alias l"l=ls"\ -l
您可能会将“/Path/中的空格转义到/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/指向一个文件”
,请使用这种方法
另一种方法是使用
mount--bind
mkdir /tmp/myfiles && mount --bind "/Path /To A" /tmp/myfiles
&然后在参数文件中,使用-Dargument1=“/tmp/myfiles/file”
这种方法将把
“/Path/装载到一个“
到/tmp/myfiles
。该脚本中的所有文件和目录结构都将被保留。该脚本在与命令eval一起使用时工作,该命令保留引号,并且不会添加任何附加的单引号
D_ARG=`(tr '\r\n' ' ' < argument.dat)
\#executing java code by passing above argument
eval java ${D_ARG} TestProgram
D_ARG=`(tr'\r\n'
但是如果我在argument.dat文件中定义了多个参数,那么这两个参数都被视为单个字符串,因为您已经为参数“${D_ARG}”指定了引号,您在原始问题中没有告诉我;)在这种情况下,您的tr
命令不是处理该问题的方法。谢谢fge。我在“java”命令(evaljava${D_ARG}TestProgram)前面使用了eval命令,解决了我的问题。谢谢你抽出时间。
D_ARG=`(tr '\r\n' ' ' < argument.dat)
\#executing java code by passing above argument
eval java ${D_ARG} TestProgram