在sh命令

时间:2018-02-14 17:51:00

标签: bash shell wildcard

我有一个使用sh -c "<command_string>"之类的调用执行shell函数的程序。我无法改变调用这些函数的方式。

在这个程序中,我调用了不同的自编写辅助shell函数,这些函数来自我的环境。其中一个看起来像这样。它将具有给定文件模式的文件解压缩到给定目录中。

function dwhUnzipFiles() {

    declare OPTIND=1
    while getopts "P:F:T:" opt; do
         case "$opt" in
         P) declare FILEPATTERN="$OPTARG" ;;
         F) declare FROMDIR="$OPTARG" ;;
         T) declare TODIR="$OPTARG" ;;
         *) echo "Unbekannte Option | Usage: dwhUnzipFiles -P <filepattern> -F <fromdir> -T <todir>"
         esac
    done
    shift $((OPTIND-1))

    for currentfile in "${FROMDIR}"/"${FILEPATTERN}" ; do 
        unzip -o "$currentfile" -d "${TODIR}"; 
    done

    # error handling
    # some more stuff

    return $?
}

对于这个函数,我使用带有通配符的参数作为FILEPATTERN变量。该函数由我的程序调用,如下所示: sh -c ". ~/dwh_env.sh && dwhUnzipFiles -P ${DWH_FILEPATTERN_MJF_WLTO}.xml.zip -F ${DWH_DIR_SRC_XML_CURR} -T ${DWH_DIR_SRC_XML_CURR}/workDir"其中${DWH_FILEPATTERN_MJF_WLTO}包含通配符。

这是按预期工作的。我的混乱开始于另一个辅助函数,它以类似的方式构造,但我无法正确控制通配符扩展。它只是删除目录中的文件,具体取决于给定的文件模式。

function dwhDeleteFiles() {

    declare retFlag=0

    declare OPTIND=1
    while getopts "D:P:" opt; do
         case "$opt" in
         D) declare DIRECTORY="$OPTARG" ;;
         P) declare FILEPATTERN="$OPTARG" ;;
         *) echo "Unbekannte Option | Usage: dwhDeleteFiles -D <Directory> -P <Filepattern>"
         esac
    done
    shift $((OPTIND-1))

    for currentfile in "${DIRECTORY}"/"${FILEPATTERN}" ; do 
        rm -fv "${currentfile}";
    done

    # error handling
    # some more stuff

    return $retFlag
}

这个函数被调用如下: sh -c ". ~/dwh_env.sh && dwhDeleteFiles -P ${DWH_FILEPATTERN_MJF_WLTO}.xml -D ${DWH_DIR_SRC_XML_CURR}/workDir"其中$ {DWH_FILEPATTERN_MJF_WLTO}包含通配符。当我用我的程序调用这个函数时,它会导致什么都不做。我尝试将""\"\"添加到我的函数的参数中,但所有发生的事情是,该函数不删除给定目录中的所有文件,而只删除第一个文件。字母数字顺序。

有人可以向我解释一下,这里发生了什么?我的想法是包含通配符的变量的多次传递不起作用。但是我如何解决这个问题,甚至可能在bash中解决这个问题?为什么dwhUnzipFiles功能正常,dwhDeleteFiles不起作用?

1 个答案:

答案 0 :(得分:1)

假设DWH_FILEPATTERN_MJF_WLTO*,并且你有一堆* .xml文件,那么命令是

dwhDeleteFiles -P *.xml -D ${DWH_DIR_SRC_XML_CURR}/workDir

扩展为

dwhDeleteFiles -P bar.xml baz.xml foo.xml zap.xml -D ${DWH_DIR_SRC_XML_CURR}/workDir

(注意xml文件的字母顺序)。但是-P选项只需一个 arg,bar.xml(第一个),其余的被视为文件参数。

尝试在脚本中设置set -x以查看此操作。