2016-07-23 36 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*

但是,如果我取代 '一' 與 'I':

$ ./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命令(而不是實際參數至極文件是*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

你能分享你的腳本的相關代碼,尤其是find命令?也許你應該將腳本作爲'-x'* a *''運行,因爲在你的腳本運行之前globbing會被展開。 – kenorb

回答

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

@Stéphane:正如你已經知道的那樣,globbing是這裏的惡棍...... – 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}"'"