Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell tar命令无法在unix sun solaris中添加附件文件_Shell_Unix - Fatal编程技术网

Shell tar命令无法在unix sun solaris中添加附件文件

Shell tar命令无法在unix sun solaris中添加附件文件,shell,unix,Shell,Unix,我一直在向程序传递附件文件名,tar命令无法为附件文件创建存档,附件文件的文件名中可能包含空格。有人能帮我找出根本原因吗 这里的atachment文件是“v Al 2015-0974_ca.pdf”“v Al 2015-0974_ma.pdf” 测试.ksh FILE=${1} ATTACHEDFILES="${2}" echo ${ATTACHEDFILES} TARGETENV=${3}

我一直在向程序传递附件文件名,tar命令无法为附件文件创建存档,附件文件的文件名中可能包含空格。有人能帮我找出根本原因吗

这里的atachment文件是“v Al 2015-0974_ca.pdf”“v Al 2015-0974_ma.pdf”

测试.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
预期输出:

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
这条线

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
2015-0974.tar
title
html
email
delivertime
"v Al 2015-0974_ca.pdf" "v Al 2015-0974_ma.pdf"
tar
将第一个参数解释为选项字符串,第二个参数解释为新创建的tarfile的文件名(因为选项字符串中有
f
),其余五个参数解释为文件名。由于
“v Al 2015-0974_ca.pdf”“v Al 2015-0974_ma.pdf”
不是现有文件的名称,因此不会将其添加到文件中

您打算用以下参数调用tar:

cvf
2015-0974.tar
title
html
email
delivertime
v Al 2015-0974_ca.pdf
v Al 2015-0974_ma.pdf
与其他编程语言一样,bash中的引号也是语法的一部分。创建的字符串不包含引号。如果确实在字符串中插入引号(通过转义引号,或使用两种类型的引号,如示例中所示),则该字符串中包含引号。它不会再次被扫描

如果要在命令行上提供文件名列表,并且需要引用文件名,则需要分别引用它们。由于脚本无法知道有多少个文件名,因此最好将列表放在末尾。可以使用slice语法(在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"
我们会这样称呼他:

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"
编辑:

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
  • 在Solaris11之前,
    ksh
    shell是ksh88,而不是ksh93,因此上述操作将不起作用。见下文。显然,有一个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 "${@}"
    

rici:“${@:4}”命令不起作用,并引发错误:错误替换。那么这个命令在Sun solaris上有效吗?@praveen:您确定在solaris系统上使用的是ksh或bash吗?也许您的脚本有一个
#/bin/sh
shebang行?无论如何,我编辑了答案以提供与posix兼容的替代方案solaris@Praveen:显然,Solaris(Solaris 11之前)中的
ksh
是ksh88,而不是ksh93。ksh93中添加了
${@:start:count}
语法。显然,有一个ksh93实现称为
/usr/dt/bin/dtksh
。在Solaris 11中,默认shell和
/usr/bin/ksh
都更改为ksh93。