当前位置: 首页 > news >正文

shell自定义函数

参考: http://www.cnblogs.com/zhaiqianfeng/p/4621297.html

“sum=$(fsum 2 5)”这种方式,是将标准输出(echo 出来的东子)传递给主程序的变量,而不是返回值!

#!/bin/bash
function sum(){

 val1=$1

 val2=$2

 val3=$(($1+$2))

 echo $val3

}

#Call function with 2 parameters and it return 1 parameter.
ret_val=$(sum 10 20)
echo $ret_val

  脚本执行结果: ret_val = $(sum 10 20)  将sum 10 20 的输出传递给变量ret_val

#!/bin/bash 
prod=1
twoPow(){
        for((i=0;i<$1;i++));
        do
                prod=$(($prod*2))
        done
}
echo "Enter a number" 
read num
twoPow $num
echo $prod

  执行脚本 c.sh

 

 

#!/bin/bash

twoPow()
{
    prod=1
    for((i=0;i<$1;i++));
    do
        prod=$(($prod*2))
    done
    return $prod
}

echo "Enter a number"
read num
twoPow num

  

 

----------------------------------------------------------------------------------------------------------------------------------

Shell的函数在使用之前必须先定义,定义格式:

1
2
3
4
5
[ function ] funname [()]
{
     action;
     [ return  int ;]
}
  • 可以带function fun()定义,也可以直接fun() 定义,不带任何参数。
  • 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

示例

1
2
3
4
5
6
7
8
9
10
fsum  2  5
 
fsum(){
     echo $ 1 ,$ 2
     return  $ 1 +$ 2
}
 
sum=$(fsum  2  5 )
echo $?
echo  "sum=$sum"

执行输出:

fsum: not found
7
sum=2,5

从上面这个例子我们可以得到几点结论:

  • 必须在调用函数地方之前,声明函数,shell脚本是逐行运行,这点和编译型语言不通。
  • 函数返回值,只能通过$? 系统变量获得,而“sum=$(fsum 2 5)”这种方式,是将标准输出传递给主程序的变量,而不是返回值!

Shell函数可以在脚本文件中使用之前定义它,也可以把函数定义在一个独立的文件使用点号(.)命令来引用它。如function.sh和testshell.sh在同一目录中,function.sh

1
2
3
4
fsum(){
     echo $ 1 ,$ 2
     return  $(($ 1 +$ 2 ))
}

testshell.sh

1
2
3
#! /bin/sh
. ./function.sh
fsum  2  5

 

相关文章:

  • SVN:show log问题
  • monaco editor + vue的配置
  • Centos7配置ubuntu本地仓库
  • jQuery 选择器
  • IP unnumbered interface,某个接口不编号,某个接口不分配IP地址
  • struts2中怎样处理404?
  • 一张图让你学会LVM
  • WiFi替代者LiFi首次实测结果出炉:1Gbps
  • 解读:四点让云计算引发全球变革
  • 数据蒋堂 | 开放的计算能力为数据库瘦身
  • 数据分析流程这么长,产品经理如何一人搞定?
  • 马斯克的OpenAI,究竟是如何在dota2中击败顶级人类选手的?
  • 《程序员度量:改善软件团队的分析学》一连接活动与目标
  • 解密:智能美妆和动效自拍背后的技术
  • Linux I2C(一)之常用的几种实例化(i2c_client ) 【转】
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • @angular/forms 源码解析之双向绑定
  • 78. Subsets
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • spark本地环境的搭建到运行第一个spark程序
  • vue-loader 源码解析系列之 selector
  • 服务器从安装到部署全过程(二)
  • 构建二叉树进行数值数组的去重及优化
  • 力扣(LeetCode)21
  • 前端js -- this指向总结。
  • 使用Gradle第一次构建Java程序
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (4)Elastix图像配准:3D图像
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (六)vue-router+UI组件库
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (四)模仿学习-完成后台管理页面查询
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 分布式技术比较
  • .NET 解决重复提交问题
  • .Net 路由处理厉害了
  • .NET 依赖注入和配置系统
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • [AR]Vumark(下一代条形码)
  • [BUAA软工]第一次博客作业---阅读《构建之法》
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [C#]C#学习笔记-CIL和动态程序集
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [C++]——带你学习类和对象
  • [codevs1288] 埃及分数