网站首页 > 技术文章 正文
我们都知道,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
执行结果:
可以看到,通过这种解析传参的方式可以对脚本的使用语法做一个说明,这样会使得脚本更加的易用,无论是自己用还是分享给别人用,那么本篇文章就先到这里,后续再详细更新语法篇!
想要了解更多关于这个传参工具的语法及技巧,请关注我吧!
看到这的朋友点个赞或者转发一下呗,非常感谢!
猜你喜欢
- 2024-12-28 3步教你,百度网盘下载不限速,比SVIP速度还要快
- 2024-12-28 魔兽怀旧服,重复交任务宏,冲声望必备
- 2024-12-28 「安卓按键」怎么让脚本可以领取免费测试卡
- 2024-12-28 写作4年挣50万,推荐6个新手容易过稿的投稿平台
- 2024-12-28 黑客大神用什么杀毒?Windows自带的就够,只是加了亿点微小强化
- 2024-12-28 微软阻止第三方下载 Windows 镜像?
- 2024-12-28 B站视频下载详细教程 b站咋样下载视频
- 2024-12-28 从0开始学习Jmeter脚本编写 jmeter打开脚本报错
- 2024-12-28 网站渗透总结之Getshell用法大全 网站渗透技术
- 2024-12-28 如何通过C脚本在WinCC画面中的“文本”不再那么单调?
- 05-16在实际操作过程中如何避免出现SQL注入漏洞
- 05-16MySQL中 in数量限制
- 05-16一文讲懂SQL筛选子句HAVING子句
- 05-16性能调优实战:Spring Boot 多线程处理SQL IN语句大量值的优化方案
- 05-16sqlserver数据库中的模糊查询like和通配符的使用
- 05-16SQL必备 和 表关联
- 05-16SQL Server优化50法
- 05-16他们一直都在!最新强军大片来了
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- js数组插入 (83)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)