我们都知道,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](https://i-blog.csdnimg.cn/blog_migrate/0dbb6fe9fc6c3a75b7d640f84f738db6.jpeg)
运行中读取键盘输入
这种方式建议放到那种直接通过选择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](https://i-blog.csdnimg.cn/blog_migrate/678938596bbabc4856ffcec7c92b3615.jpeg)
判断文件/文件夹是否存在
类似这类功能建议就是以命令行传参的方式去执行,因为我们都知道,在Linux是可以补全路径的,所以在执行脚本之前我们可以通过补全去传入一个路径会比较方便(当然你可以复制粘贴)。
另外,我们也可以通过这个方式传入很长的URL地址之类的,例如下面这种:
https://blog.csdn.net/qq_36154886
![f6d5799d2c5deda9f1dd43ed5365cd17.png](https://i-blog.csdnimg.cn/blog_migrate/71766f6560c0d54983f4815ce108feaf.jpeg)
虽然这种相对来说比之前的更方便,但是在某些场景下还是不够专业,例如下面的案例:
传入用户名密码
假设我需要写一个要通过用户名密码验证之后才能执行的操作,就像我们登录数据库那样,我们分别使用下面的登录方式进行登录
mysql -u root -pxinyang123
![29906afb75cfdeafde5f67e1fdf3f1c4.png](https://i-blog.csdnimg.cn/blog_migrate/45e9bde8472374375b698dcf21e83263.jpeg)
分别调整用户名密码顺序进行数据库登录
可以看到,无论用户名密码的传入顺序是什么,程序都可以正确解读哪个是用户名,哪个是密码
然后我们看一下帮助:
![4ff7ad743001eb527e1c4a2e2a302a6d.png](https://i-blog.csdnimg.cn/blog_migrate/dc2e196cc0b19c295bf95901756f7ef0.jpeg)
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](https://i-blog.csdnimg.cn/blog_migrate/c448271409edc4005c2a99ad514155b5.jpeg)
分别调整-u和-p的先后顺序执行
![beee0afc2ca015da8c79b0e88dad155b.png](https://i-blog.csdnimg.cn/blog_migrate/feb3e5b7061319a4444cd8119ada3131.jpeg)
分别传入帮助信息触发参数: [ -h -? ]
可以看到,通过这种解析传参的方式可以对脚本的使用语法做一个说明,这样会使得脚本更加的易用,无论是自己用还是分享给别人用,那么本篇文章就先到这里,后续再详细更新语法篇!
想要了解更多关于这个传参工具的语法及技巧,请关注我吧!
看到这的朋友点个赞或者转发一下呗,非常感谢!