getopts和包含两个'*'的参数的问题

时间:2016-07-23 23:48:42

标签: shell getopts

我的脚本由/ bin / sh解释并使用getopts。当我这样做时:

$ ./check_files.sh -d /tmp -td -x*a*

-x的Ma参数很好用(最后):

+ find /tmp/geany_socket.9912fb56 /tmp/gpg-OBxSqk /tmp/log /tmp/ssh-bfbl8kSNDM8o /tmp/systemd-private-0a769fff0c124fed8a42ec56733ade46-systemd-timesyncd.service-09Wbx1 /tmp/. /tmp/.. /tmp/.ICE-unix /tmp/.Test-unix /tmp/.X0-lock /tmp/.X11-unix /tmp/.XIM-unix /tmp/.font-unix /tmp/.xfsm-ICE-BILXKY -prune -type d ! -name *a*

但如果我用'i'替换'a':

$ ./check_files.sh -d /tmp -td -x*i*

我明白了:

+ find /tmp/geany_socket.9912fb56 /tmp/gpg-OBxSqk /tmp/log /tmp/ssh-bfbl8kSNDM8o /tmp/systemd-private-0a769fff0c124fed8a42ec56733ade46-systemd-timesyncd.service-09Wbx1 /tmp/. /tmp/.. /tmp/.ICE-unix /tmp/.Test-unix /tmp/.X0-lock /tmp/.X11-unix /tmp/.XIM-unix /tmp/.font-unix /tmp/.xfsm-ICE-BILXKY -prune -type d ! -name check_files.sh

由于我在当前目录中有一个名为'i'的文件的唯一原因,这个名称被传递给find命令(而不是*i*的实际参数。我测试了一些其他文件......

我没有这个问题,在论证中只有一个'*'。

我尝试使用简单和双引号但我得到相同的结果。

有人解释我为什么?

我使用调用破折号的shebang #!/usr/bin/env sh。我还用bash --posix运行了脚本,我有不同的结果,但仍然是我上面描述的相同问题。

根据@kenorb的要求:

(x)
    SEARCH_NAME_EXCLUDE="${OPTARG}";
(i)
    SEARCH_NAME_INCLUDE="${OPTARG}";
;;

[…]

find_name_clause() {
    if [ -n "$1" ]
    then
    FIND_NAME_CLAUSE=" -name $1 "
    fi
    if [ "$1" -a "$2" ]
        then
            FIND_NAME_CLAUSE="${FIND_NAME_CLAUSE} -a "
        fi    
        if [ -n "$2" ]
        then
            FIND_NAME_CLAUSE="${FIND_NAME_CLAUSE} ! -name  $2 "
        fi    
}

find_name_clause "${SEARCH_NAME_INCLUDE}" "${SEARCH_NAME_EXCLUDE}"
FIND_CLAUSE="${FIND_TYPE_CLAUSE} ${FIND_NAME_CLAUSE}"

[…]


nb_files() {
    NB_FILES=$(find $1 $2 |wc -l)
}

nb_files "${search} ${FIND_CLAUSE}"

2 个答案:

答案 0 :(得分:3)

设置noglob

set -o noglob

之前

./check_files.sh -d /tmp -td -x*a*

或称之为

./check_files.sh -d /tmp -td -x\*i\* # -x'*i*' will do the same

答案 1 :(得分:0)

我设法做到了这样:

find_name_clause() {
        if [ $(expr length $1) -gt 2 ]
        then
            FIND_NAME_CLAUSE=" -name "$1
        fi
        if [ $(expr length $1) -gt 2 -a $(expr length $2) -gt 2  ]
        then
            FIND_NAME_CLAUSE=${FIND_NAME_CLAUSE}" -a "
        fi    
        if [ $(expr length $2) -gt 2  ]
        then
            FIND_NAME_CLAUSE=${FIND_NAME_CLAUSE}"! -name  "$2
        fi    
}

find_name_clause "'"${SEARCH_NAME_INCLUDE}"'" "'"${SEARCH_NAME_EXCLUDE}"'"