首页 > 系统相关 >shell脚本中main函数中$#获取不到脚本传入参数个数浅析

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

时间:2024-03-14 11:14:38浏览次数:31  
标签:脚本 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,浅析
From: https://www.cnblogs.com/kerrycode/p/18072396

相关文章

  • Windows10, 11上,您可以使用以下PowerShell命令来启用Hyper-V功能组件 Windows server 2
    Windows11上,您可以使用以下PowerShell命令来启用Hyper-V功能组件:powershellCopyCodeEnable-WindowsOptionalFeature-Online-FeatureNameMicrosoft-Hyper-V-All这个命令将启用所有与Hyper-V相关的功能组件。请确保以管理员权限在PowerShell中运行此命令。执行以上命令后,系......
  • 风控规则引擎(一):Java 动态脚本
    风控规则引擎(一):Java动态脚本日常场景共享单车会根据微信分或者芝麻分来判断是否交押金汽车租赁公司也会根据微信分或者芝麻分来判断是否交押金在一些外卖APP都会提供根据你的信用等级来发放贷款产品金融APP中会根据很复杂规则来判断用户是否有借款资格,以及贷款金额。......
  • SQL Server索引查找/扫描没有出现key lookup的案例浅析
    在我们讲解这个案例前,我们先来了解/预热一下SQLServer的两个概念:键查找(keylookup)和RID查找(RIDlookup),通常,当查询优化器使用非聚集索引进行查找时,如果所选择的列或查询条件中的列只部分包含在使用的非聚集索引和聚集索引中时,就需要一个查找(lookup)来检索其他字段来满足请求。对......
  • 2024年Java中文乱码浅析及解决方案(超详细)
    嗨,亲爱的Java新手们!今天我们要聊聊一个在编程世界里经常会遇到的头疼问题——中文乱码。想象一下,你写了一段充满创意的代码,里面包含了优美的中文注释和字符串,结果运行时,它们变成了乱七八糟的字符。别担心,这就像拼图游戏里的一块块碎片,只要找到正确的拼图方法,就能恢复它们的......
  • Shell脚本
    Shell脚本1、文件头固定格式,指向系统执行的部位#!/bin/bash...2、变量2.1、系统变量$HOME=/root$USER=当前用户$PWD=当前路径$SHELL=/bin/bash2.2、自定义变量2.2.1、变量的定义(1)可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写(2)等号两侧不能......
  • pnpm : 无法加载文件 D:\dev\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。有关详
    一、问题现象  二、问题原因  1、此问题是由于PowerShell的执行策略限制了脚本的执行//通过命令可以查看当前策略Get-ExecutionPolicy     2、策略说明:Restricted:默认策略,禁止运行任何脚本,除非明确允许。AllSigned:只允许运行经由数字签名并由受信......
  • 一些常见的shell问题和答案
    什么是Shell脚本?它有什么作用?Shell脚本是一种用Shell语言编写的脚本文件,用于自动化执行一系列命令和操作。它可以用于系统管理、任务自动化、数据处理等各种用途。如何在Shell脚本中定义变量?如何使用变量?在Shell脚本中,可以使用变量名=值的形式来定义变量,例如name="John"......
  • PowerShell 命令来获取已启用的功能列表
     PowerShell命令来获取已启用的功能列表:powershellCopyCodeGet-WindowsOptionalFeature-Online|Where-Object{$_.State-eq"Enabled"}请在PowerShell窗口中运行该命令,它应该能够列出已启用的Windows功能 命令来获取Windows功能的详细信息,包括其状态:shel......
  • linux Shell 命令行-07-func 函数
    拓展阅读linuxShell命令行-00-intro入门介绍linuxShell命令行-02-var变量linuxShell命令行-03-array数组linuxShell命令行-04-operator操作符linuxShell命令行-05-test验证是否符合条件linuxShell命令行-06-flowcontrol流程控制linuxShell命令行-07-f......
  • linux 程序状态查询脚本
    linux程序状态查询脚本#!/bin/bashsource/etc/profileDOCKERCOMPOSE=/usr/local/bin/docker-composeSHELL_FOLDER=$(cd"$(dirname"$0")";pwd)action=${1-}#workdir=$PWD#cd$workdir#docker-composepsfunctionGetApollo(){echo""......