2015-06-01 88 views
0

我一直在將附件文件名傳遞給程序,並且tar命令無法爲附件文件創建歸檔文件,並且附件文件可以在其文件名中包含空格。有人可以幫我在查明根源tar命令無法在unix sun中添加附件文件solaris

這裏已將附件文件「V鋁2015-0974_ca.pdf」, 「V鋁2015-0974_ma.pdf」

ksh testing.ksh 2015-0974.htm '"v Al 2015-0974_ca.pdf" "v Al 2015-0974_ma.pdf"' Int 5 

testing.ksh

FILE=${1}        
    ATTACHEDFILES="${2}" 
    echo ${ATTACHEDFILES} 
    TARGETENV=${3}        
    PRIORITY=${4}         

    FNWP=${FILE%.*}       
    EXT=${FILE#*.}       
    FN=${FNWP##*/} 

val="tar cvf ${FN}.tar title html email delivertime "${ATTACHEDFILES}"" 
echo $val 
package=${PRIORITY}_$(date +"%Y%m%d%H%M%S")_eytaxalert.nwf 
gzip -cv ${FN}.tar > ${package} 

exit 0 

輸出:

a title 1K 
a html 33K 
a email 4K 
2015-0974.tar 

預期輸出:

a title 1K 
a html 33K 
a email 4K 
a v Al 2015-0974_ca.pdf 20K 
a v Al 2015-0974_ma.pdf 15K 
2015-0974.tar 

回答

2

此行

testing.ksh 2015-0974.htm '"v Al 2015-0974_ca.pdf" "v Al 2015-0974_ma.pdf"' Int 5 

調用的testing.ksh腳本具有四個參數,它們是從字面上:

2015-0974.htm 
"v Al 2015-0974_ca.pdf" "v Al 2015-0974_ma.pdf" 
Int 
5 

注意,第二個參數是一個嵌有四個引號的字符串它。然後你把它分配到$ATTACHEDFILES和(我認爲)執行以下(我懷疑來自事實,你只是在你的問題的片段中迴應這個事實,但我猜你粘貼了一個調試版本):

tar cvf ${FN}.tar title html email delivertime "${ATTACHEDFILES}" 

這就要求焦油七個參數

cvf 
2015-0974.tar 
title 
html 
email 
delivertime 
"v Al 2015-0974_ca.pdf" "v Al 2015-0974_ma.pdf" 

tar將解釋的第一個參數爲anoption字符串,第二個爲新創建的tar文件的文件名(因爲選項字符串的f),以及其餘五個作爲文件名。由於"v Al 2015-0974_ca.pdf" "v Al 2015-0974_ma.pdf"不是現有文件的名稱,因此不會將其添加到tarfile。

您打算什麼援引焦油這些論點:

cvf 
2015-0974.tar 
title 
html 
email 
delivertime 
v Al 2015-0974_ca.pdf 
v Al 2015-0974_ma.pdf 

喜歡漂亮以及所有其他的編程語言,在bash引號是語法的一部分。所創建的字符串不包含引號。如果您將引號插入到字符串中(通過轉義引號或使用兩種引用類型),那麼字符串中會有引號。它不會再被掃描。

如果您想要在命令行中提供文件名列表,並且需要引用文件名,則需要單獨引用它們。由於你的腳本無法知道有多少文件名,所以最好把列表放在最後。您可以使用片語法(在bash或ksh93中)引用參數列表:"${@:4}"是從參數4開始的逐字參數列表(與腳本提供的內容完全相同)。"${@:4:2}"恰恰是兩個以參數4開頭的參數,但我認爲在這種情況下,你會希望所有的參數結束。請注意,該語法中的引號是必需的;他們是什麼表明這些論據應該按原樣傳遞,而不是分詞。

所以你的代碼可能看起來是這樣的:

FILE=${1} 
TARGETENV=${2}        
PRIORITY=${3}         

FNWP=${FILE%.*}       
EXT=${FILE#*.}       
FN=${FNWP##*/} 

tar cvf "${FN}.tar" title html email delivertime "${@:4}" 

,並會被稱爲是這樣的:

ksh testing.ksh 2015-0974.htm Int 5 "v Al 2015-0974_ca.pdf" "v Al 2015-0974_ma.pdf" 

編輯:

  • 的Solaris 11,之前, ksh shell是ksh88,而不是ksh93,所以上面的wi我不行。見下文。顯然,有一個ksh93實現可用dtksh

  • 萬一非標準語法"${@:4}"不起作用,這裏是一個簡單的符合POSIX標準的選擇:

    FILE=${1} 
    TARGETENV=${2}        
    PRIORITY=${3} 
    # Remove the three arguments from the argument list: 
    shift 3 
    
    FNWP=${FILE%.*}       
    EXT=${FILE#*.}       
    FN=${FNWP##*/} 
    
    tar cvf "${FN}.tar" title html email delivertime "${@}" 
    
+0

RICI: 「$ {@:4}」 命令不工作並拋出一個錯誤:錯誤的替代。那麼這個命令是否可以在Sun solaris上運行? – Praveen

+0

@praveen:你確定你在Solaris系統上使用ksh或bash嗎?也許你的腳本有'#!/ bin/sh' shebang行?無論如何,我編輯答案來提供posix兼容的選擇。 – rici

+0

我在solaris中使用ksh – Praveen