我的脚本由/ 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}"
答案 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}"'"