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

 更新时间:2024年03月18日 10:58:24   作者:潇湘隐者  
Linux的shell脚本,有时候我们在运行shell脚本时会给脚本传入参数,出于逻辑上的严谨,在脚本中可能会做一些逻辑判断或处理,例如判断脚本传入参数的个数,这篇文章主要介绍了shell脚本中main函数中$#获取不到脚本传入参数个数浅析,需要的朋友可以参考下

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;

到此这篇关于shell脚本中main函数中$#获取不到脚本传入参数个数浅析的文章就介绍到这了,更多相关shell脚本传入参数个数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Linux学习之expect操作详解

    Linux学习之expect操作详解

    expect是一种脚本语言,它能够代替人工实现与终端的交互,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。本文将通过示例详细说说它的使用,感兴趣的可以了解一下
    2022-10-10
  • Linux Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点

    Linux Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点

    这篇文章主要介绍了Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点,需要的朋友可以参考下
    2016-02-02
  • Linux修改主机名的命令详解

    Linux修改主机名的命令详解

    通常在购买的服务器或者一些新安装的Linux系统主机名是一个随机的字符串,但是如果说我们想标识一下每台主机的名称,我们就可以修改一下主机名,所以本文给大家介绍了Linux修改主机名的命令,需要的朋友可以参考下
    2024-01-01
  • Shell脚本中实现切换用户并执行命令操作

    Shell脚本中实现切换用户并执行命令操作

    这篇文章主要介绍了Shell脚本中实现切换用户并执行命令操作,看了示例代码就秒懂了,原来如此简单,需要的朋友可以参考下
    2014-12-12
  • shell编程中的字符串截取方法小结

    shell编程中的字符串截取方法小结

    这篇文章主要介绍了shell编程中的字符串截取方法小结,本文讲解了截取字符变量的前8位的方法、按指定的字符串截取方法、按照指定要求分割方法等内容,需要的朋友可以参考下
    2015-03-03
  • Linux rm命令详解 Linux删除文件目录的操作方法

    Linux rm命令详解 Linux删除文件目录的操作方法

    这篇文章主要介绍了Linux rm命令详解,Linux删除文件目录,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • Shell编程之循环语句示例详解

    Shell编程之循环语句示例详解

    在Shell 脚本开发中,经常碰到一些规范方面的问题,例如忘了便用引号或在 if 语句末尾处忘记加 fi 结束,这篇文章主要介绍了Shell编程之循环语句,需要的朋友可以参考下
    2023-12-12
  • Shell中eval的用法示例

    Shell中eval的用法示例

    这篇文章主要介绍了Shell中eval的用法示例,本文给出多个示例来讲解它的使用,需要的朋友可以参考下
    2015-07-07
  • Linux命令中的rpm安装命令

    Linux命令中的rpm安装命令

    RPM 的全称为Redhat Package Manager ,是由Redhat 公司提出的,用于管理Linux 下软件包的软件。下面通过本文给大家分享Linux命令中的rpm安装命令,需要的的朋友参考下吧
    2017-06-06
  • 详解shell 遍历文件夹内所有文件并打印绝对路径

    详解shell 遍历文件夹内所有文件并打印绝对路径

    本篇文章主要介绍了shell 遍历文件夹内所有文件并打印绝对路径,具有一定的参考价值,有兴趣的可以了解一下。
    2017-01-01

最新评论