Shell tar命令无法在unix sun solaris中添加附件文件
我一直在向程序传递附件文件名,tar命令无法为附件文件创建存档,附件文件的文件名中可能包含空格。有人能帮我找出根本原因吗 这里的atachment文件是“v Al 2015-0974_ca.pdf”“v Al 2015-0974_ma.pdf” 测试.kshShell 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}
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之前,
shell是ksh88,而不是ksh93,因此上述操作将不起作用。见下文。显然,有一个ksh93实现作为ksh
提供dtksh
- 如果非标准语法
不起作用,这里有一个简单的Posix兼容替代方案:“${@:4}”
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 "${@}"
#/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。