如何为Shell别名/函数添加类似rm、find的选项功能?
为bash目录创建函数添加选项的几种方法
先修正你现有代码里的小问题:函数末尾的fi是多余的,应该删掉,否则运行会报错。
除了直接判断输入内容是否为选项的方式,还有更规范、可扩展的方法来处理命令行选项,下面是两种常用方案:
1. 使用getopts处理短选项
getopts是bash内置的选项解析工具,专门用来处理类似-p、-v这类短选项,适合简单的选项场景。
示例代码:
alias mkdirDate="f1" function f1() { local create_file=0 local verbose=0 # 解析选项 while getopts "pv" opt; do case $opt in p) create_file=1 ;; # -p选项:创建file.py v) verbose=1 ;; # -v选项:显示详细信息 \?) echo "无效选项: -$OPTARG" >&2; return 1 ;; esac done shift $((OPTIND - 1)) # 移除已解析的选项,剩下的参数作为项目名(如果有的话) # 获取项目名称:如果命令行已经传入项目名,直接用;否则提示输入 local tmp if [ $# -gt 0 ]; then tmp="$*" else vared -p 'Project name: ' -c tmp fi # 创建目录 local dir_name="$(date +%Y%m%d) $tmp" mkdir "$dir_name" [ $verbose -eq 1 ] && echo "已创建目录: $dir_name" # 如果有-p选项,创建file.py if [ $create_file -eq 1 ]; then touch "$dir_name/file.py" [ $verbose -eq 1 ] && echo "已在目录中创建file.py" fi }
使用方式:
- 直接创建目录并提示输入名称:
mkdirDate - 创建目录同时生成file.py:
mkdirDate -p - 显示详细操作信息:
mkdirDate -v - 组合选项+直接传入项目名:
mkdirDate -pv "My Project"
2. 使用while循环解析长选项
如果需要支持--create-file、--verbose这类长选项,可以用while循环结合case语句来处理,扩展性更强。
示例代码:
alias mkdirDate="f1" function f1() { local create_file=0 local verbose=0 local tmp="" # 解析长/短选项 while [[ $# -gt 0 ]]; do case $1 in --create-file|-p) create_file=1 shift ;; --verbose|-v) verbose=1 shift ;; --) # 结束选项解析,后续内容作为项目名 shift tmp="$*" break ;; *) # 非选项内容,作为项目名 tmp="$*" break ;; esac done # 如果没有传入项目名,提示用户输入 if [ -z "$tmp" ]; then vared -p 'Project name: ' -c tmp fi # 创建目录 local dir_name="$(date +%Y%m%d) $tmp" mkdir "$dir_name" [ $verbose -eq 1 ] && echo "已创建目录: $dir_name" # 处理创建文件的逻辑 if [ $create_file -eq 1 ]; then touch "$dir_name/file.py" [ $verbose -eq 1 ] && echo "已创建文件: $dir_name/file.py" fi }
使用方式:
- 长选项用法:
mkdirDate --create-file --verbose "New Project" - 混合长短选项:
mkdirDate -p --verbose - 用
--分隔选项和项目名(比如项目名以-开头时):mkdirDate -p -- "-My-Project"
这两种方法都比直接判断输入内容更规范,能区分选项和目录名称,避免项目名和选项冲突的问题,也更容易扩展更多功能。
内容的提问来源于stack exchange,提问作者notRelevant
相关产品推荐
相关产品推荐

