2016-07-23 4 views
2

Мой скрипт интерпретируется/bin/sh и использует getopts. Когда я делаю:Проблема с getopts и аргумент, содержащий два '*'

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

Ма аргумент -x хорошо используется (в конце):

+ 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*

Но если я заменить 'а' с 'я':

$ ./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

по уникальной причине у меня есть файл с «я» в его имени в моем текущем каталоге, это имя передается команде FIND (вместо фактического аргумента Wich является *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}" 
+0

Не могли бы вы поделиться соответствующий код вашего скрипта, особенно найти команду? Возможно, вы должны запустить скрипт как '-x '* a *'', так как globbing будет расширен до запуска вашего скрипта. – kenorb

ответ

3

Set 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 
+0

@ Стефан: Как вы уже разобрались, глотание - это злодей здесь. – sjsam

+1

Он по-прежнему делает то же самое. Возможно, мне придется использовать эту конструкцию в другом месте сценария. –

+0

Проблема, вероятно, связана с «FIND_NAME_CLAUSE =» $ {FIND_NAME_CLAUSE}! -name $ 2 "' – sjsam

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}"'"