shell 工具_Shell高级语法:专业的脚本传参解析工具Getopts

我们都知道,Shell脚本在执行过程中可以从键盘读取输入的参数,通过读取键盘数据是非常灵活也是非常重要的一种方式。

但是Shell脚本的传参多种多样,每一种都有其适用场景,例如运行的时候输入、执行之前传入

通过顺序传入或者采用-开头的指定传入,例如:-u user -p 12345

并且传入还可能需要考虑必传参数、可传参数等各种因素,那么哪些场景适合使用哪一种呢?下面带你了解一下!

运行中读取键盘输入

下面通过一个简单的功能选择脚本做一个演示,主要功能为:查询主机的IP或主机名

#!/bin/bash##坐公交也用券echo  "请输入一个选择[1]查询IP(默认)[2]查询主机名"read cmdif [[ "$cmd" -eq '2' ]];then        echo -e "当前主机名: [ `hostname` ]"else        echo -e "当前主机的IP: [ `hostname -I` ]"fi

执行结果:

951b4694f39f02feea60ea34b8925351.png

运行中读取键盘输入

这种方式建议放到那种直接通过选择123的方式就能达到需求的场景下使用。

运行前传入参数

判断文件/文件夹是否存在

脚本内容如下:

#!/bin/bash#坐公交也用券check(){        if [[ -e "$1" ]];then                if [[ -f "$1" ]];then                        echo -e "文件: [ $1 ]是存在的"                elif [[ -d "$1" ]];then                        echo -e "文件夹: [ $1 ]是存在的"                fi        else                echo -e "找不到[ $1 ]"        fi}for i in $*;do        check $idone

执行命令:

bash file.sh /etc/systemd/timesyncd.conf /usr/share/systemd/tmp.mount /var/lib/docker  /var/lib/dockerdd

执行结果:

f2fa207717945bb093184c3daa8d28a3.png

判断文件/文件夹是否存在

类似这类功能建议就是以命令行传参的方式去执行,因为我们都知道,在Linux是可以补全路径的,所以在执行脚本之前我们可以通过补全去传入一个路径会比较方便(当然你可以复制粘贴)。

另外,我们也可以通过这个方式传入很长的URL地址之类的,例如下面这种:

https://blog.csdn.net/qq_36154886

f6d5799d2c5deda9f1dd43ed5365cd17.png

虽然这种相对来说比之前的更方便,但是在某些场景下还是不够专业,例如下面的案例:

传入用户名密码

假设我需要写一个要通过用户名密码验证之后才能执行的操作,就像我们登录数据库那样,我们分别使用下面的登录方式进行登录

 mysql  -u root  -pxinyang123
29906afb75cfdeafde5f67e1fdf3f1c4.png

分别调整用户名密码顺序进行数据库登录

可以看到,无论用户名密码的传入顺序是什么,程序都可以正确解读哪个是用户名,哪个是密码

然后我们看一下帮助:

4ff7ad743001eb527e1c4a2e2a302a6d.png

mysql使用帮助

也就是说,通过 - 开头传入的参数可以打乱传入的顺序,例如上面的 -p -u ,那么如果我们的脚本也想实现这样的操作应该怎么做呢?下面带你了解一下:

想要实现类似mysql那样的传参方式,就需要了解一下Shell里面的getopts

getpots是Shell命令行参数解析工具,旨在从Shell Script的命令行当中解析参数。

下面通过简单的演示带你了解一下这个神奇的工具,脚本内容如下:

#!/bin/bash##By:坐公交也用券@今日头条##时间: 2020-11-27 9:40help() {    echo "Usage:"    echo "Shell.sh [-u user ] [-p passwd ]"    echo "描述:传入语法及作用     [ -u user ]; 通过 [ -u ] 传入用户名     [ -p passwd ]; 通过 [ -p ]传入密码     感谢使用"    exit 1}#为执行过程设置一个默认值status='Flase'while getopts 'u:p:h' OPT; do    case $OPT in        'u') user_name="$OPTARG"                echo -e "通过[ -u ]传入了用户名: [ $user_name ]";;        'p') passwd="$OPTARG"                echo -e "通过 [ -p ]传入了密码: [ $passwd ]";;        'h') help                echo "通过 [ -h ]调用了帮助函数: [ help ]";;        '?') help                echo "通过 [ ? ]调用了帮助函数: [ help ]";;    esacdonestatus='True'echo -e "传入的用户名: [ $user_name ]传入的密码: [ $passwd ]"if [[ "$status" -eq 'True' ]];then        echo -e "脚本成功走完最后一步"fi

执行结果:

b2171e8f13ded740aa5f412d8c270f0a.png

分别调整-u和-p的先后顺序执行

beee0afc2ca015da8c79b0e88dad155b.png

分别传入帮助信息触发参数: [ -h -? ]

可以看到,通过这种解析传参的方式可以对脚本的使用语法做一个说明,这样会使得脚本更加的易用,无论是自己用还是分享给别人用,那么本篇文章就先到这里,后续再详细更新语法篇!

想要了解更多关于这个传参工具的语法及技巧,请关注我吧!

看到这的朋友点个赞或者转发一下呗,非常感谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值