2015-06-01 55 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