2013-01-11 49 views
0

我正在使用shell腳本來調用java程序。當調用傳遞Java程序時,我正在傳遞具有目錄路徑的-Dargument。這個-D參數是從文件中讀取的。現在,當這條路徑包含空格時,我正面臨一個問題。我試着用報價和轉義報價,但都努力工作。在Shell腳本中使用帶空格的路徑

這裏是我的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" 

當我設置迴音使用設置-x,我見外殼將其轉換爲

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

如果它增加了,當它遇到的空間,我得到單引號「/」未找到類除外離子。如何解決這個問題。任何建議或幫助將非常可觀。

回答

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 
+0

但如果我必須在argument.dat文件中定義多個參數,那麼雙方的觀點被認爲是一個字符串,因爲你有沒有指定的參數報價「$ {} D_ARG」 – Mojoy

+0

在原始問題中告訴它);在這種情況下,你的'tr'命令不是處理這個問題的方法。 – fge

+0

查看編輯後的解決方案 – fge

0

您可能會轉義「/ Path/To A/File」中的空格。然而,這不是一個很好的解決方案,因爲很多時候,我們可以制定這樣的命令在Linux系統上

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. 
     */ 

更好的選擇是創建符號鏈接。

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。其中的所有文件&目錄結構將被保留。

0

該腳本在與eval命令一起使用時保持工作狀態,該命令保留了引號,並且它添加了任何其他單引號。

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