我正在使用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”类未找到异常。如何解决这个问题。任何建议或帮助将非常感激。
试试这个:
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
您可能会转义“/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
。其中的所有文件和目录结构都将被保留。
该脚本与命令 eval 一起使用时有效,该命令保留引号并且不添加任何额外的单引号。
D_ARG=`(tr '\r\n' ' ' < argument.dat)
\#executing java code by passing above argument
eval java ${D_ARG} TestProgram