在函数中使用变量

news2024/9/22 15:31:20

shell脚本编程系列


向函数传递参数

函数可以使用标准的位置变量来表示在命令行中传给函数的任何参数。其中函数名保存在$0变量中,函数参数则依次保存在$1$2等变量当中,也可以使用特殊变量$#来确定参数的个数

在脚本中调用函数时,必须将参数和函数名放在同一行 比如 func $value 10

#!/bin/bash
# passing parameters to a function

function addem {
   if [ $# -eq 0 ] || [ $# -gt 2 ]
   then
      echo -1
   elif [ $# -eq 1 ]
   then
      echo $[ $1 + $1 ]
   else
      echo $[ $1 + $2 ]
   fi
}

echo -n "Adding 10 and 15: "
value=$(addem 10 15)
echo $value
echo -n "Let’s try adding just one number: "
value=$(addem 10)
echo $value
echo -n "Now trying adding no numbers: "
value=$(addem)
echo $value
echo -n "Finally, try adding three numbers: "
value=$(addem 10 15 20)
echo $value

在这里插入图片描述
由于函数使用位置变量访问函数参数,所以无法直接获取脚本的命令行参数。即使在函数内部使用了$1和$2变量,但它们和脚本主体中的$1和$2变量不是一回事

#!/bin/bash
# trying to access script parameters inside a function

function badfunc1 {
   echo $[ $1 * $2 ]
}

if [ $# -eq 2 ]
then
   value=$(badfunc1)
   echo "The result is $value"
else
   echo "Usage: badtest1 a b"
fi

在这里插入图片描述
要在函数中使用脚本的命令行参数,必须调用函数时手动将其传入

#!/bin/bash
# trying to access script parameters inside a function

function func7 {
   echo $[ $1 * $2 ]
}

if [ $# -eq 2 ]
then
   value=$(func7 $1 $2)
   echo "The result is $value"
else
   echo "Usage: badtest1 a b"
fi

在这里插入图片描述

在函数中处理变量

  • 全局变量
    全局变量是在shell脚本内任何地方都有效的变量,如果在脚本的主体部分定义了一个全局变量,那么就可以在函数内读取它的值。类似的,在函数内定义了一个全局变量,那么也可以在脚本的主体部分读取它的值。默认情况下,脚本中定义的任何变量都是全局变量
    在这里插入图片描述

  • 局部变量
    无需在函数中使用全局变量,任何在函数内部使用的变量都可以被声明为局部变量。只需要在变量前面加上local关键字即可,local关键字可以保证变量仅仅在该函数中有效,如果函数之外有同名变量,那么shell会保持这两个变量的值互不干扰。

    #!/bin/bash
    # demonstrating the local keyword
    
    function func1 {
       local temp=$[ $value + 5 ]
       result=$[ $temp * 2 ]
    }
    
    temp=4
    value=6
    
    func1
    echo "The result is $result"
    if [ $temp -gt $value ]
    then
       echo "temp is larger"
    else
       echo "temp is smaller"
    fi
    

    在这里插入图片描述

  • 数组变量
    将数组变量当做当个参数传递,并不会起作用。如果试图将数组变量作为函数参数进行传递,则函数只会提取数组变量的第一个元素

    #!/bin/bash
    # trying to pass an array variable
    
    function testit {
       echo "The parameters are: $@"
       thisarray=$1
       echo "The received array is ${thisarray[*]}"
    }
    
    myarray=(1 2 3 4 5)
    echo "The original array is: ${myarray[*]}"
    testit $myarray
    

    在这里插入图片描述
    必须先将数组变量拆解成多个数组元素,然后将这些数组元素作为函数参数传递,而在函数内部,将所有的参数重新组合成一个新的数组变量

    #!/bin/bash
    # adding values in an array
    
    function addarray {
       local sum=0
       local newarray
       newarray=(`echo "$@"`)
       for value in ${newarray[*]}
       do
          sum=$[ $sum + $value ]
       done
       echo $sum
    }
    
    myarray=(1 2 3 4 5)
    echo "The original array is: ${myarray[*]}"
    # arg1=$(echo ${myarray[*]})
    # result=$(addarray $arg1)
    result=$(addarray ${myarray[*]})
    echo "The result is $result"
    

    在这里插入图片描述
    从函数中返回数组先用echo语句按照正确顺序输出数组的各个元素,然后脚本再将数组元素重组成一个新的数组变量。

    #!/bin/bash
    # returning an array value
    
    function arraydblr {
       local origarray
       local newarray
       local elements
       local i
       origarray=($(echo "$@"))
       newarray=($(echo "$@"))
       elements=$[ $# - 1 ]
       for (( i = 0; i <= $elements; i++ ))
       {
          newarray[$i]=$[ ${origarray[$i]} * 2 ]
       }
       echo ${newarray[*]}
    }
    
    myarray=(1 2 3 4 5)
    echo "The original array is: ${myarray[*]}"
    arg1=$(echo ${myarray[*]})
    result=($(arraydblr $arg1))
    echo "The new array is: ${result[*]}"
    

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/465226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day3 TCP/IP协议与五层体系结构

TCP / IP 四层体系结构 TCP / IP工作流程&#xff1a; 现在互联网使用的 TCP/IP 体系结构已经发生了演变&#xff0c;即某些应用程序可以直接使用 IP 层&#xff0c;或甚至直接使用最下面的网络接口层。 沙漏型展示&#xff1a; 五层体系结构 各层的主要功能 应用层&#xff1…

C++ Primer阅读笔记--语句的使用

① 空语句 最简单的语句是空语句&#xff0c;其只含有一个单独的分号&#xff1b; ② switch语句 case 关键字和它对应的值一起被称为 case 标签&#xff0c;case 标签必须是整型常量表达式&#xff1b; char ch getVal(); int iVal 42; switch(ch){case 3.14: // 错误&#…

ZmosHarmony buildroot移植与使用

前言 移植过程 1、添加编译选项编译buildroot。 2、开机启动时设置 LD库的环境变量与PATH路径。 是什么原因需要这样操作&#xff1f; 主要使用busybox&#xff0c;使用buildroot的瑞士军dao。 使用busybox 为buildroot下的使用 第一次启动时设置 由于是在vendor分区因此 …

01 openEuler虚拟化-KVM虚拟化简介

文章目录 01 openEuler虚拟化-KVM虚拟化简介1.1 简介1.2 虚拟化架构1.3 虚拟化组件1.4 虚拟化特点1.5 虚拟化优势1.6 openEuler虚拟化 01 openEuler虚拟化-KVM虚拟化简介 1.1 简介 在计算机技术中&#xff0c;虚拟化是一种资源管理技术&#xff0c;它将计算机的各种实体资源&…

ActiveMQ 反序列化漏洞 (CVE-2015-5254)漏洞复现

当前漏洞环境部署在vulhub,当前验证环境为vulhub靶场&#xff08;所有实验均为虚拟环境&#xff09; 实验环境&#xff1a;攻击机----kali 靶机&#xff1a;centos7 需要的jar包&#xff1a;jmet-0.1.0-all.jar 1、启动docker&#xff0c;进入vulhub&#xff08;靶机&#xff0…

centos主机测试io极限

这里使用fio工具来测试磁盘的io 1.安装fio命令 yum -y install fio 2.在需要测试的磁盘所挂载的目录下创建一个测试目录 由于我就只有一个磁盘&#xff0c;/目录也挂载在这个磁盘上&#xff0c;所以就直接在tmp目录里创建 mkdir /tmp/cs 3.创建一个名为 test.fio 的文件&a…

中级软件设计师备考---信息系统安全

目录 安全属性对称加密技术非对称加密技术信息摘要和数字签名数字信封和PGP各个网络层次的安全保障网络威胁与攻击防火墙技术 安全属性 保密性&#xff1a;最小授权原则、防暴露、信息加密、物理保密 完整性&#xff1a;安全协议、校验码、密码校验、数字签名、公证 可用性&a…

【 Spring 事务传播机制 】

文章目录 一、概念二、为什么需要事务传播机制&#xff1f;三、事务传播机制有哪些&#xff1f;四、Spring 事务传播机制使⽤和各种场景演示4.1 ⽀持当前事务&#xff08;REQUIRED&#xff09;4.2 不⽀持当前事务&#xff08;REQUIRES_NEW&#xff09;4.3 NESTED 嵌套事务4.4 嵌…

软考软件设计师 软件工程笔记

软件工程 CMM&#xff08;能力成熟度模型&#xff09;CMMI&#xff08;能力成熟度模型集成&#xff09;瀑布模型V模型&#xff08;质量保证&#xff09;增量模型演化模型&#xff08;迭代更新&#xff09;原型模型螺旋模型&#xff08;风险分析&#xff09;喷泉模型统一过程&am…

大数据编程实验二:熟悉常用的HDFS操作

实验目的 1、理解HDFS在Hadoop体系结构中的角色 2、熟悉使用HDFS操作常用的Shell命令 3、熟悉HDFS操作常用的Java API 实验平台 1、操作系统&#xff1a;Windows 2、Hadoop版本&#xff1a;3.1.3 3、JDK版本&#xff1a;1.84、Java IDE&#xff1a;IDEA 实验步骤 前期&#x…

Springboot整合WebSocket(纯后端)

文章目录 一、 HTTP协议与WebSocket区别二、客户端&#xff08;浏览器&#xff09;实现1、websocket对象2、websocket事件3、WebSocket方法 三、服务端实现1、连接过程2、服务端接收客户端消息3、服务端推送消息给客户端 四、后端功能实现 一、 HTTP协议与WebSocket区别 HTTP协…

如何在家自学编程成为一名程序员?

转自&#xff1a;如何在家自学编程&#xff0c;成为一名优秀的程序员&#xff1f; - 知乎 跟着黑马程序员学&#xff0c;自学也可以很优秀。先找到方向—>前/后端&#xff1f;测试&#xff1f;还是什么&#xff1f;—>找到相关的学习路线 —> 坚持不懈的学习 —> …

论文学习——Video LDM (Align your Latents)

Align your Latents: High-Resolution Video Synthesis with Latent Diffusion Models 0. 来源 本文是阅读论文后的个人笔记&#xff0c;适应于个人水平&#xff0c;叙述顺序和细节详略与原论文不尽相同&#xff0c;并不是翻译原论文。 如果想了解所有细节&#xff0c;建议移…

华为OD机试真题(Java),旋转数组的最小数字(100%通过+复盘思路)

一、题目描述 有一个长度为 n 的非降序数组&#xff0c;比如[1,2,3,4,5]&#xff0c;将它进行旋转&#xff0c;即把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;变成一个旋转数组&#xff0c;比如变成了[3,4,5,1,2]&#xff0c;或者[4,5,1,2,3]这样的。请问&#xf…

Filter 的使用

把对资源的请求拦截下来&#xff0c;从而实现一些特殊功能 &#xff0c;比如需要先登录再使用其他功能 拦截对资源的请求 放行后&#xff0c;执行完资源&#xff0c;再执行放行后的逻辑 按字符比较升序排序&#xff0c;值小的优先级高 FilterDemo优先级高于FilterDemo2 Listene…

华为OD机试真题(Java),最长的连续子序列(100%通过+复盘思路)

一、题目描述 有N个正整数组成的一个序列&#xff0c;给定一个整数sum&#xff0c;求长度最长的的连续子序列使他们的和等于sum&#xff0c;返回该子序列的长度&#xff0c;如果没有满足要求的序列返回-1。 二、输入描述 第1行有N个正整数组成的一个序列。 第2行给定一个整…

[MySQL]基础知识笔记(数据库与表操作)

内存与硬盘的区别&#xff1a; 内存&#xff1a;容量小&#xff0c;速度快&#xff0c;造价高&#xff0c;断电后数据丢失硬盘&#xff1a;容量大&#xff0c;速度慢&#xff0c;造价低&#xff0c;断电后数据不丢失 常见的关系型数据库&#xff1a; 1.ACCESS-微软出的在OFF…

【RPA开发】Beautiful Soup 使用详解

爬虫时通过 requests.get 方法获得 html 源代码后&#xff0c;通常需要从源代码中提取关键信息&#xff0c;这有多种方式&#xff0c;比如使用正则表达式匹配&#xff0c;也可通过 python 的第三方库 Beautiful Soup 实现定位提取关键信息&#xff0c;类似的库还有 lxml 第三方…

如何配置java环境以及tomcat详细步骤

jdk 下载安装及配置 jdk 官网地址: https://www.oracle.com/java/(opens new window) #1、jdk 下载 进入官网,定位到:Java -> Java SE -> Oracle JDK 点击进入,如下图所示: 选择 Java archive,再鼠标下拉页面,选择 Java SE 8 (8u202 and earlier) 下载 jdk-8u2…

一款综合地图应用Vue组件,内置了百度、高德、天地图瓦片

一、开源项目简介 新德汇地图应用类库 基于Openlayers的地图应用Vue组件。内置了百度、高德、天地图瓦片&#xff0c;并支持与方正、超图、山海经纬、航天精一等PGIS厂商对接。包含文本、图形、html、热力图、轨迹回放等20个组件&#xff0c;支持与ECharts结合实现散点、飞行…