《Linux运维总结:shell命令行参数解析工具》



一、背景

原脚本执行命令:bash fssh.sh 192.168.1.11 "systemctl status sshd"

问题:如果脚本中使用的参数非常多的情况下,那使用上面这种方式就非常不合适,这样就无法清楚地记得每个位置对应的是什么参数,现在需要加上-h和-c参数来实现相同的功能。

现脚本执行命令:bash fssh.sh -h 192.168.1.11 -c “systemctl status sshd”"


二、工具介绍

参考getopts详解

getpots是Shell命令行参数解析工具,旨在从Shell Script的命令行当中解析参数。getopts被Shell程序用来分析位置参数,option包含需要被识别的选项字符,如果这里的字符后面跟着一个冒号,表明该字符选项需要一个参数,其参数需要以空格分隔。冒号和问号不能被用作选项字符。getopts每次被调用时,它会将下一个选项字符放置到变量中,OPTARG则可以拿到参数值;如果option前面加冒号,则代表忽略错误。

命令格式:

getopts optstring name [arg...]

命令描述:
optstring列出了对应的Shell Script可以识别的所有参数。比如:如果 Shell Script可以识别-a,-f以及-s参数,则optstring就是afs;如果对应的参数后面还跟随一个值,则在相应的optstring后面加冒号。比如,a:fs 表示a参数后面会有一个值出现,-a value的形式。另外,getopts执行匹配到a的时候,会把value存放在一个叫OPTARG的Shell Variable当中。如果 optstring是以冒号开头的,命令行当中出现了optstring当中没有的参数将不会提示错误信息。

name表示的是参数的名称,每次执行getopts,会从命令行当中获取下一个参数,然后存放到name当中。如果获取到的参数不在optstring当中列出,则name的值被设置为?。命令行当中的所有参数都有一个index,第一个参数从1开始,依次类推。 另外有一个名为OPTIND的Shell Variable存放下一个要处理的参数的index。

例如:bash fssh.sh -h 192.168.1.11 -c “systemctl status sshd”"
在这里插入图片描述


三、实例介绍

3.1、简单参数

在shell脚本中,对于简单的参数,常常会使$1,$2,...,$n来处理即可

具体如下所示:

vim test1.sh 
#!/bin/sh
echo "shell脚本本身的名字: $0"
echo "传给shell的第一个参数: $1"
echo "传给shell的第二个参数: $2"

执行结果如下图所示:
在这里插入图片描述
说明:上面的例子中参数少还可以,但是如果脚本中使用的参数非常多的情况下,那使用上面这种方式就非常不合适,这样就无法清楚地记得每个位置对应的是什么参数!这个时候我们就可以使用bash内置的getopts工具了,用于解析shell脚本中的参数!下面就来看几个例子:


3.2、实例介绍

#!/bin/bash
func() {
    echo "Usage:"
    echo "test.sh [-s s_ip] [-d d_ip] "
    echo "Description:"
    echo "s_ip,the ip of source."
    echo "d_ip,the ip of destination."
    exit -1
}
cmd="false"
while getopts 's:d:u' opt; do
    case $opt in
        s)
            s_ip="$OPTARG"
            ;;
        d)
            d_ip="$OPTARG"
            ;;
        u)
            cmd="true"
            ;;
        ?)
            func
            ;;
    esac
done
echo $s_ip
echo $d_ip
echo $cmd

执行结果如下图所示:
在这里插入图片描述
总结:getopts后面跟的字符串就是参数列表,每个字母代表一个选项,如果字母后面跟一个:,则就表示这个选项还会有一个值,比如上面例子中对应的-s 192.168.1.11 和-d 192.168.1.12 。而getopts字符串中没有跟随:的字母就是开关型选项,不需要指定值,等同于true/false,只要带上了这个参数就是true。

getopts识别出各个选项之后,就可以配合case进行操作。操作中,有两个"常量",一个是OPTARG,用来获取当前选项的值;另外一个就是OPTIND,表示当前选项在参数列表中的位移。case的最后一项是?,用来识别非法的选项,进行相应的操作,我们的脚本中输出了帮助信息。


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:Linux运维实战总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东城绝神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值