翼度科技»论坛 云主机 LINUX 查看内容

shell脚本中main函数中$#获取不到脚本传入参数个数浅析

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
Linux的shell脚本,有时候我们在运行shell脚本时会给脚本传入参数,出于逻辑上的严谨,在脚本中可能会做一些逻辑判断或处理,例如判断脚本传入参数的个数。一般我们会用$#获取传入参数的个数,假如,我们在shell脚本的main函数中去判断脚本传入参数的个数,类似如下所示:
  1. .........
  2. function main()
  3. {
  4.     if [ $# != 1 ]; then
  5.       echo "This script must be run with one parameter"
  6.       echo "Usage:mysql_slowlog_monitor.sh 6h"
  7.       exit 1
  8.     fi

  9.     check_enviroment;
  10.     send_slow_rpt;
  11.     return 0;
  12. }

  13. main;
复制代码
如果你去调试这个shell脚本的话,就会发现main函数中$#的值永远是0, 如果将脚本调整一下,将判断传入参数个数的脚本放到main函数外(不能放在其它函数中),如下所示,这样就Ok了
  1. .............

  2. if [ $# != 1 ]; then
  3.   echo "This script must be run with one parameter"
  4.   echo "Usage:mysql_slowlog_monitor.sh 6h"
  5.   exit 1
  6. fi

  7. .............
  8. function main()
  9. {
  10.     check_enviroment;
  11.     send_slow_rpt;
  12.     return 0;
  13. }

  14. main;
复制代码
那么为什么会出现这种情况呢?在解答这个问题前,我们先来了解一下$#的用途,$#表示脚本传入参数的个数,也表示一个函数(function)调用时,传入函数的参数(arguments)个数,而且它也是有作用域范围,如果在函数(function)内部的话,它表示的函数调用时,传入参数的个数。
那么再来解答这个问题,上面shell脚本中,main函数调用时写法为main;意味着函数调用时没有传入任何参数,所以$#在main中值为0,而在脚本mysql_slowlog_monitor.sh中获取传入的参数个数,应该在脚本中,而且在脚本中的函数外面获取它的值。
那么怎么解决这个问题呢?
解决方案1:

将判断脚本调用时传入的参数的脚本放到函数外面,就像上面示例脚本那样处理。
解决方案2:

借助全局变量,先在函数外获取脚本传入参数的个数,将其赋值为全局变量,然后在mian函数中,进行逻辑判断和处理。
  1. .............
  2. ARGS=$#
  3. .............
  4. function main()
  5. {
  6.     if [ $ARGS != 1 ]; then
  7.       echo "This script must be run with one parameter"
  8.       echo "Usage:mysql_slowlog_monitor.sh 6h"
  9.       exit 1
  10.     fi
  11.     check_enviroment;
  12.     send_slow_rpt;
  13.     return 0;
  14. }

  15. main;
复制代码
扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
来源:https://www.cnblogs.com/kerrycode/p/18072396
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具