linux bash shell的getopt以及函数用法小记

  • getopt 长选项 短选项 可选参数
  • while
  • case
  • if
  • basename
  • 函数
  • 变量
  • shift
  • read

实现功能描述:

  1. 实现可选参数传入 -c 或 --clearBuild。

  2. 用shell脚本来实现选择,make时是否clean。

  3. 可以打印用法帮助 和 作者信息。

bash 复制代码
#!/bin/bash

# sh函数定义 *************************** 
usage()
{
    sh_name=$(basename $1);
    # sh_name='basename $1';  #或者这个
    echo "
    ---------------
    用法:      $sh_name [选项] <(可选) -c >  <(可选) --clearBuild >
    命令行选项:
            -c  或 --clearBuild     默认: 0,
                                    表示是否清除make build的内容,数值为1表示清理,为0表示直接构建
    可选选项:
            -h  或 --help           打印帮助信息
            -a  或 --author         打印作者信息
    ---------------
    "
    exit 1;
}
author()
{
    sh_name=$(basename $1);
     # sh_name='basename $1';  #或者这个 
echo "
    ---------------
    脚本:  $sh_name 

    作者:  WJH    
    ---------------
    "
    exit 1;
}

fun1_make()
{
    if [ "$1" = "clear" ] ; then
        # echo '执行清理并构建文件';
        echo 'in fun1_make(): 先clean 然后 make';
        # your cmd .....
    else
        # echo "不清除已经构建好的文件"
        echo "in fun1_make(): 直接make"
        # your cmd .....
    fi
}

# sh变量定义与接收 *************************** 


# 输入指令
parameters=$(getopt -a -o c::ha -l clearBuild::,help,author -n "$0" -- "$@")
# echo "原始参数origin param is $@"

if [ $? != 0 ]; then
    echo "脚本解析失败..."; exit 1;
fi
# set命令将规范化后的命令参数分配到位置参数 $1 $2上面
eval set  -- "${parameters}"
# echo "规范后参数formatetd parameters=[$@]"
 
# sh识别输入的选项·参数 *************************** 
while true; 
do
    case "$1" in
    -c | --clearBuild)
        case "$2" in
        "") echo "选项 --clearBuild 无参数";    
            clearBuild=${clearBuild:=1};  #赋默认值
            shift 2;  # 可选参数仍有空参数,需要shift 2, 
            ;;
        *) echo "选项 --clearBuild 参数为:$2";  clearBuild=$2;  
            shift 2;
            ;;
        esac
        ;;
    -h|--help)
        usage $0 ;
        ;;
    -a|--author)
        author $0 ;
        ;;
    --)
        echo "clearBuild 默认值 1, clearBuild 现在数值:$clearBuild"; # 默认值见 68行
        echo "-----------------";  shift 1; break; 
        ;;
    *)
        echo "Internal error!!!";  exit 1 ;
        ;;
    esac
done

# sh业务逻辑 *************************** 

# 比较字符串是否相等用 =, 并在两边留空格
# 比较数字用 -eq -gt -lt 等,分别为 equal; greater than; less than;等
if [ "$clearBuild" = "1" ] ; then  # 输入了 选项时 或 可选参数时  
    echo '>>>执行清理,然后构建';
    fun1_make clear;
    # your cmd .....

elif [ "$clearBuild" = "0" ] ; then # 输入了 选项时 或 可选参数时 
    echo ">>>直接构建"
    fun1_make direct_build;
    # your cmd ..... 
    
else                                # 未输入 选项时 
    read -p '未输入 选项时:
    输入clear 确认清除并重新构建; 输入不为clear,直接构建  : ' tmp2
    if [ "$tmp2" = "clear" ] ; then
        echo ">>>执行清理,然后构建";
        fun1_make $tmp2;
        # your cmd ..... 
    else 
        echo ">>>直接构建"
        fun1_make $tmp2;
        # your cmd .....
    fi
 fi

 echo "-----------------";

参考文章

1.设计shell脚本选项:getopt - 骏马金龙 - 博客园 (cnblogs.com)

2.081_扩展篇_Shell编程(七)_函数(二)_自定义函数_哔哩哔哩_bilibili

3.Linux------shell脚本的传参方式 - moutory - 博客园 (cnblogs.com)

相关推荐
流浪0011 分钟前
Linux系统篇26——通信(三)补:共享内存访问真的不进内核?
linux·运维·服务器
不会就选b4 分钟前
Linux之socket编程(七)----序列化与反序列化(1)
java·linux·服务器
zerwave25 分钟前
从零实现简化 DDS 完整技术文档(含模块作用与详细注释)
linux·c++·机器人
琥珀色糖10 小时前
Linux守护进程
linux·终端·守护进程·会话·进程组
开心大爆炸14 小时前
xrdp 连接 登录对话框输入密码后闪退
linux·运维·服务器
oushaojun214 小时前
大厂 C++ 面试:深度剖析 Linux Signal 信号机制(转)
linux
苏生Susheng15 小时前
【软件实施】Linux系统Shell脚本教程
linux·运维·服务器·chrome·spring boot·学习·实施
Ruiery15 小时前
Linux 6.6内核 IOMMU 深度解析(七):DMA API 与 IOMMU 集成 — 从 dma_map_single 到 iommu_map
linux·运维·服务器
分支预测失败15 小时前
RISC-V AIA 中断架构实战:从 PLIC 到 APLIC 与 IMSIC 的迁移
linux·后端
GeW15 小时前
RHCE学习拿证计划:锁定核心考点,实现备考效率最大化
linux