shell脚本中main函数中$#获取不到脚本传入参数个数浅析
2024-03-14 11:01 潇湘隐者 阅读(208) 评论(0) 编辑 收藏 举报Linux的shell脚本,有时候我们在运行shell脚本时会给脚本传入参数,出于逻辑上的严谨,在脚本中可能会做一些逻辑判断或处理,例如判断脚本传入参数的个数。一般我们会用$#获取传入参数的个数,假如,我们在shell脚本的main函数中去判断脚本传入参数的个数,类似如下所示:
.........
function main()
{
if [ $# != 1 ]; then
echo "This script must be run with one parameter"
echo "Usage:mysql_slowlog_monitor.sh 6h"
exit 1
fi
check_enviroment;
send_slow_rpt;
return 0;
}
main;
如果你去调试这个shell脚本的话,就会发现main函数中$#的值永远是0, 如果将脚本调整一下,将判断传入参数个数的脚本放到main函数外(不能放在其它函数中),如下所示,这样就Ok了
.............
if [ $# != 1 ]; then
echo "This script must be run with one parameter"
echo "Usage:mysql_slowlog_monitor.sh 6h"
exit 1
fi
.............
function main()
{
check_enviroment;
send_slow_rpt;
return 0;
}
main;
那么为什么会出现这种情况呢?在解答这个问题前,我们先来了解一下$#的用途,$#表示脚本传入参数的个数,也表示一个函数(function)调用时,传入函数的参数(arguments)个数,而且它也是有作用域范围,如果在函数(function)内部的话,它表示的函数调用时,传入参数的个数。
那么再来解答这个问题,上面shell脚本中,main函数调用时写法为main;意味着函数调用时没有传入任何参数,所以$#在main中值为0,而在脚本mysql_slowlog_monitor.sh中获取传入的参数个数,应该在脚本中,而且在脚本中的函数外面获取它的值。
那么怎么解决这个问题呢?
解决方案1:
将判断脚本调用时传入的参数的脚本放到函数外面,就像上面示例脚本那样处理。
解决方案2:
借助全局变量,先在函数外获取脚本传入参数的个数,将其赋值为全局变量,然后在mian函数中,进行逻辑判断和处理。
.............
ARGS=$#
.............
function main()
{
if [ $ARGS != 1 ]; then
echo "This script must be run with one parameter"
echo "Usage:mysql_slowlog_monitor.sh 6h"
exit 1
fi
check_enviroment;
send_slow_rpt;
return 0;
}
main;

· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2022-03-14 Postfix发送邮件时报错“libmysqlclient.so.18: cannot open shared object file: No such file or directory”
2018-03-14 SQL Server等待事件—RESOURCE_SEMAPHORE_QUERY_COMPILE
2016-03-14 如何分析解读systemstat dump产生的trc文件
2016-03-14 SQL Server里面如何检查没有释放的游标
2015-03-14 Red Hat Enterprise Linux 各个版本以及发布日期
2015-03-14 Linux MySQL源码安装缺少ncurses-devel包
2014-03-14 Create view failed with ORA-01031:insufficient privileges