以下功能代码实现并非原创,只不过在源码的基础弄明白整个功能如何运行,代码比较简单,作为基础学习提高下技术。
源码解读
#!/bin/bash
## help function,操作说明
function helpu {
echo " "
echo "Fuzzy search for filename."
# $0 脚本本身的名称
echo "$0 [--match-case|--path] filename"
echo " "
exit
}
## set variables
MATCH="-iname"
SEARCH="."
## parse options,匹配命令
while [ True ]; do
# -o 布尔运算符,有一个表达式为true,则返回true
if [ "$1" = "--help" -o "$1" = "-h" ]; then
helpu
elif [ "$1" = "--match-case" -o "$1" = "-m" ]; then
MATCH="-name"
# shift 命令用于对参数的移动(左移),在不知道传入参数个数的情况下依次
# 遍历每个参数,然后进行相应的处理
shift 1
elif [ "$1" = "--path" -o "$1" = "-p" ]; then
# ${} 用于变量替换,会比较精确的界定变量名词的范围
# 这里当命令行参数是 --path ~ 或者 -p ~,把家目录 ~ 赋值给了 SEARCH
# 代替 . 当前目录
SEARCH="${2}"
shift 2
else
break
fi
done
## sanitize input filenames
## create array, retain spaces
# ${@} 引用变量,同 $@(传给脚本的所有参数列表),可读性比 $@ 好
ARG=( "${@}" )
# -e 若指令返回值不为0,则退出shell
set -e
## catch obvious input error
# "X$ARG" = "X",判断字符串是否相等,加上 X,是为了防止 $ARG 为空时
# 出现语法错误。也就是说,当查找的内容为空时,调用 helpu 函数
if [ "X$ARG" = "X" ];then
helpu
fi
## preform search
for query in ${ARG[*]}; do
# 实际真正查询的命令:find ,可搜索多个值
# 例如:$ find ~ -name *scr* *bin*
# $ /usr/bin/find ~ -name *scr*
/usr/bin/find "${SEARCH}" "${MATCH}" "*${ARG}*"
done