Shell函数的7种用法介绍

2023-11-13

1. 在shell文件内部定义函数并引用:

 

复制代码代码如下:

[~/shell/function]# cat factorial.sh 
#!/bin/bash
function factorial
{
factorial=1
for (( i=1;i <= $1;i++ ))
        do
        factorial=$[ $factorial * $i ]
        done
echo $1的阶乘是:$factorial
}
echo '程序名':$0,用于求阶乘
factorial $1
[~/shell/function]# ./factorial.sh 10

 

程序名:./factorial.sh,用于求阶乘
10的阶乘是:3628800

2.返回值

函数返回码是指函数最后一条命令的状态码,可以用于函数返回值
使用return命令手动指定返回值:

 

复制代码代码如下:

[~/shell/function]# cat return.sh 
#!/bin/bash
function fun1 {
  read -p "enter a: " a
  echo -n "print 2a: "
  return $[ $a * 2 ]
}
fun1
echo "return value $?"
[~/shell/function]# ./return.sh 
enter a: 100
print 2a: return value 200

 

由于shell状态码最大是255,所以当返回值大于255时会出错。

 

复制代码代码如下:

[~/shell/function]# ./return.sh 
enter a: 200
print 2a: return value 144

 

3.函数输出

为了返回大于255的数、浮点数和字符串值,最好用函数输出到变量:

 

复制代码代码如下:

[~/shell/function]# cat ./fun_out.sh 
#!/bin/bash
function fun2 {
  read -p "enter a: " a
  echo -n "print 2a: "
  echo $[ $a * 2 ]
}
result=`fun2`
echo "return value $result"
[~/shell/function]# ./fun_out.sh     
enter a: 400
return value print 2a: 800

 

4.向函数传递参数(使用位置参数):

 

复制代码代码如下:

[~/shell/function]# cat ./parameter.sh 
#!/bin/bash
if [ $# -ne 3 ]
then
    echo "usage: $0 a b c"
    exit
fi
fun3() {
    echo $[ $1 * $2 * $3 ]
}
result=`fun3 $1 $2 $3`
echo the result is $result
[~/shell/function]# ./parameter.sh  1 2 3
the result is 6
[~/shell/function]# ./parameter.sh  1 2
usage: ./parameter.sh a b c

 

5.全局变量与局部变量

默认条件下,在函数和shell主体中建立的变量都是全局变量,可以相互引用,当shell主体部分与函数部分拥有名字相同的变量时,可能会相互影响,例如:

复制代码代码如下:

[~/shell/function]# cat ./variable.sh    
#!/bin/bash
if [ $# -ne 3 ]
then
    echo "usage: $0 a b c"
    exit
fi
temp=5
value=6
echo temp is: $temp
echo value is: $value
fun3() {
    temp=`echo "scale=3;$1*$2*$3" | bc -ql`   
    result=$temp
}
fun3 $1 $2 $3
echo "the result is $result"
if [ `echo "$temp > $value" | bc -ql` -ne 0 ]
then 
    echo "temp is larger"
else
    echo "temp is still smaller"
fi
[~/shell/function]# ./variable.sh  12 3 2
temp is: 5
value is: 6
the result is 72
temp is larger

 

在这种情况下,在函数内部最好使用局部变量,消除影响。

 

复制代码代码如下:

[~/shell/function]# cat ./variable.sh 
#!/bin/bash
if [ $# -ne 3 ]
then
    echo "usage: $0 a b c"
    exit
fi
temp=5
value=6
echo temp is: $temp
echo value is: $value
fun3() {
    local temp=`echo "scale=3;$1*$2*$3" | bc -ql`   
    result=$temp
}
fun3 $1 $2 $3
echo "the result is $result"
if [ `echo "$temp > $value" | bc -ql` -ne 0 ]
then 
    echo "temp is larger"
else
    echo "temp is still smaller"
fi
[~/shell/function]# ./variable.sh  12 3 2
temp is: 5
value is: 6
the result is 72
temp is still smaller

 

6.向函数传递数组变量:

 

复制代码代码如下:

[~/shell/function]# cat array.sh 
#!/bin/bash
a=(11 12 13 14 15)
echo ${a[*]}
function array(){
  echo parameters : "$@" 
  local factorial=1
  for value in "$@"
  do
    factorial=$[ $factorial * $value ]
  done
  echo $factorial
}
array ${a[*]}
[~/shell/function]# ./array.sh 
11 12 13 14 15
parameters : 11 12 13 14 15
360360

 

7.函数返回数组变量

 

复制代码代码如下:

[~/shell/function]# cat array1.sh 
#!/bin/bash
a=(11 12 13 14 15)
function array(){
  echo parameters : "$@" 
  local newarray=(`echo "$@"`)
  local element="$#"
  local i
  for (( i = 0; i < $element; i++ ))
  {
    newarray[$i]=$[ ${newarray[$i]} * 2 ]    
  }
  echo  new value:${newarray[*]}
}
result=`array ${a[*]}`
echo ${result[*]}
[~/shell/function]# ./array1.sh 
parameters : 11 12 13 14 15 new value:22 24 26 28 30
 
 
http://www.jb51.net/article/57951.htm
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shell函数的7种用法介绍 的相关文章

  • 有没有办法让我简化这些回声? [复制]

    这个问题在这里已经有答案了 我仍在学习如何编写 shell 脚本 并且我面临着一个挑战 让我更容易回显 Name1 Name2 Name15 我不太确定从哪里开始 我已经想法 但如果我搞砸了 我不想看起来很傻 有什么帮助吗 我实际上还没有尝
  • 如何使用shell脚本从json字符串中grep特定字段值[重复]

    这个问题在这里已经有答案了 下面是文件中可用的 JSON 字符串 我需要从中提取值status在 shell 脚本中 预期输出 status success 响应 json eventDate null dateProccessed nul
  • sed 错误“未终止的 's' 命令”故障排除

    我正在构建一个script https stackoverflow com questions 4036832 replacing a specific term in an xml file其中 它将用文件夹路径替换 XML 文件中的模式
  • 如何查看正在运行的 tcsh 版本?

    如何查看我的 UNIX 终端中运行的 tcsh 的当前版本 看着那 这version多变的 echo version tcsh 6 14 00 Astron 2005 03 25 i386 intel linux options wide
  • 从 UNIX 命令行向串行端口发送字节?

    我想使用命令行将字节流发送到串行端口 这可能吗 我的串口位于 dev cu usbserial A700dYoR在我的 Mac 上 例如 如果我想将整数 50 或字符串 data 发送到该串行端口 我该怎么做 我对 UNIX 的了解非常有限
  • 是否可以创建一个脚本来保存和恢复权限?

    我正在使用 Linux 系统 需要对一组嵌套文件和目录进行一些权限实验 我想知道是否没有某种方法可以保存文件和目录的权限 而不保存文件本身 换句话说 我想保存权限 编辑一些文件 调整一些权限 然后将权限恢复到目录结构中 将更改的文件保留在适
  • 通过 sed 使用 unix 变量将数据附加到每行末尾[重复]

    这个问题在这里已经有答案了 我有一个文件 我想使用 SED 将值附加到每行末尾的 unix 变量中 我已经通过 AWK 实现了这一点 但我想在 SED 中实现 像这样的东西 我已经尝试过以下命令 但它不起作用 sed i s BATCH R
  • shell中如何从数组中随机选择一个项目

    我正在 Shell 脚本中创建一个机器人 Array with expressions expressions Ploink Poink I Need Oil Some Bytes are Missing Poink Poink Piiii
  • Shell 脚本中的块注释

    有没有一种简单的方法可以注释掉 shell 脚本中的代码块 In bash bin bash echo before comment lt lt END bla bla blurfl END echo after comment The a
  • java Runtime.getRunTime().exec 和通配符?

    我正在尝试使用删除垃圾文件 Process p Runtime getRuntime exec 只要我不使用通配符 它 就可以正常工作 即 Process p Runtime getRuntime exec bin rm f specifi
  • 如何让 STDOUT 和 STDERR 都转到终端和日志文件?

    我有一个脚本 将由非技术用户交互式运行 该脚本将状态更新写入 STDOUT 以便用户可以确定脚本运行正常 我希望将Stdout和STDERR重定向到终端 以便用户可以看到脚本正在工作 并查看是否存在问题 我还希望将两个流都重定向到日志文件
  • GNU 并行与 rsync

    我正在尝试运行一些实例rsync并行使用ssh with GNU parallel 我正在运行的命令是这样的 find tmp tempfolder type f name chunck sort parallel gnu j 4 v ss
  • 调用 cat 时 shell 脚本挂起

    我有一个 shell 脚本 它通过电子邮件向我发送通过 crontasks 遇到的错误 如下所示 exec gt output cat shopt s nocasematch if output error output warning t
  • 如何列出 nginx 中的所有虚拟主机

    有没有一个命令可以列出 CentOS 上 nginx 下运行的所有虚拟主机或服务器 我想将结果通过管道传输到文本文件以用于报告目的 我正在寻找与我用于 Apache 的命令类似的命令 apachectl S 2 gt 1 grep 端口 8
  • 使用运算符 j 操作 zsh 数组

    以下代码摘自here http eseth org 2010 git in zsh html function vi git st local ahead behind remote local a gitstatus Are we on
  • exec()、shell_exec()、curl_exec() 的安全漏洞

    有时 我会使用 exec shell exec 和curl exec 以下是典型用途 假设其中有 PHP 变量 即第一个变量中的 html 用户有可能修改其内容 从安全漏洞的角度来看 我应该关注什么 escapeshellcmd 和 esc
  • PHP exec rm -Rf 不适用于子目录

    我试图删除特定文件夹中的所有内容 但它似乎不会影响子文件夹 但它应该 因为 bash 命令是从控制台执行的 system rm Rf some dir 该命令中不需要星号 如果要与文件一起删除目录 请同时删除斜杠 留下斜杠将删除文件 但保留
  • 如何在 Bash 中删除字符串的第一部分?

    该代码将给出第一部分 但是如何删除它并获取没有第一部分的整个字符串 echo first second third etc cut d f1 你应该看看info cut 这将解释什么f1 means 实际上我们只需要第二个字段之后的字段 f
  • 批量检测系统是32位还是64位

    有谁知道如何创建一个批处理文件 如果是 64 位系统 可以对一个程序进行 shell 处理 如果是 32 位系统 则可以对另一个程序进行 shell 处理 检查 PROCESSOR ARCHITECTURE being x86 if PRO
  • 如何将命令输出作为多个参数传递给另一个命令

    我想将命令的每个输出作为多个参数传递给第二个命令 例如 grep pattern input returns file1 file2 file3 我想复制这些输出 例如 cp file1 file1 bac cp file2 file2 b

随机推荐

  • Mysql中having语句与where语句的用法与区别

    分析 回答 我们在写sql语句的时候 经常会使用where语句 很少会用到having 其实在mysql中having子句也是设定条件的语句与where有相似之处但也有区别 having子句在查询过程中慢于聚合语句 sum min max
  • 网络安全——数据链路层安全协议

    作者简介 一名云计算网络运维人员 每天分享网络与运维的技术与干货 座右铭 低头赶路 敬事如仪 个人主页 网络豆的主页 目录 前言 一 数据链路层安全协议简介 1 数据链路安全性 二 局域网数据链路层协议 1 本地链路局域网 LAN 2 广域
  • 学习笔记:简谈推挽电路

    推挽电路 push pull 就是两个不同极性晶体管间连接的输出电路 推挽电路采用两个参数相同的功率BJT管或MOSFET管 以推挽方式存在于电路中 各负责正负半周的波形放大任务 电路工作时 两只对称的功率开关管每次只有一个导通 所以导通损
  • 数据库数据恢复-Oracle数据库数据恢复案例

    数据库数据恢复环境 Oracle数据库ASM磁盘组有4块成员盘 数据库故障 分析 Oracle数据库ASM磁盘组掉线 ASM实例无法挂载 用户联系我们要求恢复oracle数据库 数据库数据恢复工程师拿到磁盘后 先将所有磁盘以只读方式进行扇区
  • 第六天 01-hydra工具windows远程桌面的密码爆破

    windows远程桌面的密码爆破 概述 RDP是Windows的远程桌面协议 所占用的端口默认为3389 这个是可以修改的 要求 我们要暴力破解3389号端口的前提是对方的3389号端口是开放的 爆破工具 kali使用hydra 九头蛇 工
  • python文件开头两行#!/usr/bin/python和# -*- coding:utf-8 -*-解释以及Pycharm自动创建py文件头部信息

    我们常见到python文件的前两行都会写上如下两行代码 下面我分别解释这两条语句的意义 并介绍pycharm中自动生成py文件头部信息的方法 usr bin env python coding utf 8 或者 usr bin python
  • vs2019 中编译和使用 protobuf 库

    背景 protobuf 是一种跨平台的序列化结构数据的方法 可用于网络数据传输及存储 本文对使用 vs2019 编译 protobuf 库文件进行说明 相关代码及安装文件均来自官网下载 VS2019 编译 protobuf 生成 sln 工
  • 实时语音通讯技术的应用场景与挑战

    随着互联网和移动通信技术的快速发展 实时语音通讯技术已经成为人们日常生活和工作中不可或缺的一部分 实时语音通讯技术可以让人们通过网络进行实时语音通话 不受时间和地点的限制 带来了极大的便利和效率提升 本文将探讨实时语音通讯技术的应用场景和挑
  • Java并发之ThreadLocal源码分析(第二篇:添加元素)

    前言 两个与添加元素相关的方法 initialValue 用于初始化一个默认值 set 用于添加一个元素 set 方法分析 public void set T value Thread t Thread currentThread Thre
  • Pycharm运行unittest报错ModuleNotFoundError: No module named ‘pytest‘解决

    使用unittest未import pytest相关功能语句 在pycharm中右键run的时候报错 Traceback most recent call last File B Application pycharm PyCharm 20
  • FCK配置中文版(转自网络,未知来源)

    1 FCKConfig CustomConfigurationsPath 自定义配置文件路径和名称 2 FCKConfigFCKConfig EditorAreaCSS FCKConfig BasePath css fck editorar
  • MATLAB 图像平移操作(转)

    function outImage immove inImage Tx Ty m n size inImage Tx fix Tx Ty fix Ty move xif Tx lt 0 inImage imcrop inImage abs
  • Android 下拉选择框自定义view

    首先来看一下实现的效果 基本思路 继承PopupWindow的自定义View 说明 下图这部分自己布局 本文中主要说明的是点击某个分类显示的下拉实现 第一步 自定义 SpinnerPopuwindow继承PopupWindow Create
  • Markdown编写公式

    文章目录 Markdown编写公式 一 修改设置 二 希腊字母 三 一些数据结构 四 定界符 五 可变大小的符号 六 函数名称 七 二进制运算符和关系运算符 八 箭头符号 九 其他特殊符号 十 上下标 十一 矩阵 十二 分段函数 1 分段函
  • 集群篇-k8s介绍

    TOC 集群篇 k8s介绍 一 集群业务介绍 集群篇 服务器的搭建 集群的管理 运维 1 集群业务介绍 集群 k8s及自动化部署 服务器的预警监控功能 二 k8s 集群部署 K8S部署 DevOps 百度云地址 提取码 1111 1 k8s
  • 扫雷(C语言版)

    引言 扫雷游戏是一款经典的逻辑游戏 它不仅考验玩家的观察力和决策能力 还能带给玩家休闲娱乐的乐趣 本文将介绍一个简单的扫雷游戏的实现 帮助读者了解这款游戏的基本原理和代码实现 一 游戏规则简介 扫雷游戏的目标是找到所有没有地雷的方块 同时避
  • 服务器操作系统的实时性,对虚拟化操作系统进行实时性调度的解决方案介绍

    图3 中断实时响应分析 虚拟操作系统应用中常会有以下3类事件的实时响应需要考虑 0类事件 底层硬件中断需要得到上层某个Domain的快速响应处理 1类事件 Domain GuestOS 之间的通信事件需要被另一个Doamin快速处理 2 类
  • Portal_JS,用JS实现的Portlet效果

    有一年多没有关顾自己的博客了 然还有部分博友造访 令我万分感动 现在发布一下最近的一个组件 PortletWin package ElementUtils js author 熊水林 xionglb 163 com version 版权所有
  • Linux驱动-编译驱动模块的Makefile和脚本

    Makefile内容 ARCH arm CROSS COMPILE arm poky linux gnueabi 也可以同时编译多个模块 obj m export symbol o export symbol1 o export symbo
  • Shell函数的7种用法介绍

    1 在shell文件内部定义函数并引用 复制代码代码如下 shell function cat factorial sh bin bash function factorial factorial 1 for i 1 i lt 1 i do