You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:06:19