【问题标题】:ksh read file names from a directoryksh 从目录中读取文件名
【发布时间】:2014-09-26 16:03:01
【问题描述】:

我正在编写一个 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

【问题讨论】:

    标签: ksh


    【解决方案1】:

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

    如果您有 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 2015-04-22
      • 1970-01-01
      相关资源
      最近更新 更多