ksh从目录中读取文件名

时间:2014-09-26 16:03:02

标签: ksh

我正在编写一个Korn Shell脚本,它将获取一个zip文件并将内容解压缩到一个目录中。

该文件可能并不总是在目录中,并且在名称中具有发布日期,例如ALLIANCEBANK_DELTA_20141004_ABE.zip

我写了一个快速脚本来检查文件的存在,用*ALLIANCEBANK_DELTA_*_ABE.zip)替换日期。

如果我回显变量,它会扩展名称,但if语句不会扩展它。

#!/bin/ksh

ALLIANCE_BANKFILE=/swift0/usrdata/messages/FA_ALLIANCE_BANKFILE_OUT/ALLIANCEBANK_DELTA_*_ABE.zip
echo $ALLIANCE_BANKFILE
if [[ -e $ALLIANCE_BANKFILE ]]
then
    print "$ALLIANCE_BANKFILE found"
else
    print "$ALLIANCE_BANKFILE not found"
fi

running this gives me:

$ ./file-exists-test.ksh
/swift0/usrdata/messages/FA_ALLIANCE_BANKFILE_OUT/ALLIANCEBANK_DELTA_20141004_ABE.zip
/swift0/usrdata/messages/FA_ALLIANCE_BANKFILE_OUT/ALLIANCEBANK_DELTA_*_ABE.zip not found

1 个答案:

答案 0 :(得分:1)

通配符的扩展在变量赋值中发生。它确实发生在回声中,因为没有引用变量。

如果你有 ksh93 ,你可以这样做:存储文件名(可能有0个,1个或更多) 数组。使用~(N:pattern)表单,这样如果没有匹配模式的文件,则模式将被空字符串替换(默认情况下:如果没有匹配的文件,则保留模式字符串)。

dir=/swift0/usrdata/messages/FA_ALLIANCE_BANKFILE_OUT
ALLIANCE_BANKFILES=( ~(N:$dir/ALLIANCEBANK_DELTA_*_ABE.zip) )  # use an array

if (( ${#ALLIANCE_BANKFILES[@]} == 0))
then
    print "no ALLIANCE_BANKFILES found"
else
    print "${#ALLIANCE_BANKFILES[@]} files found:"
    printf "%s\n" "${ALLIANCE_BANKFILES[@]}"
fi