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)

相关推荐
天才奇男子4 小时前
HAProxy高级功能全解析
linux·运维·服务器·微服务·云原生
学嵌入式的小杨同学5 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
酥暮沐5 小时前
iscsi部署网络存储
linux·网络·存储·iscsi
❀͜͡傀儡师6 小时前
centos 7部署dns服务器
linux·服务器·centos·dns
Dying.Light6 小时前
Linux部署问题
linux·运维·服务器
S19016 小时前
Linux的常用指令
linux·运维·服务器
小义_6 小时前
【RH134知识点问答题】第7章 管理基本存储
linux·运维·服务器
梁洪飞7 小时前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
_运维那些事儿7 小时前
VM环境的CI/CD
linux·运维·网络·阿里云·ci/cd·docker·云计算
Y1rong8 小时前
linux之文件IO
linux