优秀的编程知识分享平台

网站首页 > 技术文章 正文

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

nanyue 2024-12-28 14:33:36 技术文章 4 ℃

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


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

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


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

运行中读取键盘输入

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

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

执行结果:

这种方式建议放到那种直接通过选择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 $i
done

执行命令:

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

执行结果:


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

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

https://blog.csdn.net/qq_36154886



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


传入用户名密码

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

 mysql  -u root  -pxinyang123

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

然后我们看一下帮助:

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


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

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

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

#!/bin/bash
##By:坐公交也用券@今日头条
##时间: 2020-11-27 9:40
help() {
    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 ]";;
    esac
done
status='True'
echo -e "传入的用户名: [ $user_name ]\n传入的密码: [ $passwd ]"
if [[ "$status" -eq 'True' ]];then
        echo -e "脚本成功走完最后一步"
fi

执行结果:



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


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

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

Tags:

最近发表
标签列表