前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何在 Bash 中编写函数

如何在 Bash 中编写函数

作者头像
用户1880875
修改于 2021-09-16 10:15:20
修改于 2021-09-16 10:15:20
2.1K00
代码可运行
举报
运行总次数:0
代码可运行

在编程时,实际上是在定义要由计算机执行的 过程(procedure)例程(routine)。一个简单的类比是将计算机编程与烤面包进行比较:你一次列出了要组建工作环境的配料,然后列出了烤面包所必须采取的步骤。在编程和烘烤中,必须以不同的间隔重复执行某些步骤。例如,在烤面包中,这可能是酵母培养的过程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
STIR=100
SNOOZE=86400

function feed_culture {
  remove_from(pantry)
  add(flour, water)
  stir($STIR)
  sleep($SNOOZE)
}

然后,揉面和醒发面团:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
KNEAD=600
SNOOZE=7200

function process_dough {
  remove_from(proofing_drawer)
  knead($KNEAD)
  return_to_drawer($SNOOZE)
}

在编程中,这些 子例程(subroutines)可以表示为 函数(function)。函数对程序员很重要,因为它们有助于减少代码中的冗余,从而减少了所需的维护量。例如,在以编程方式烤制面包的假想场景中,如果你需要更改面团醒发的用时,只要你之前使用函数,那么你只需更改一次用时,或使用变量(在示例代码中为 SNOOZE)或直接在处理面团的子程序中更改用时。这样可以节省你很多时间,因为你不必通过你的代码库遍历每个可能正在醒发的面团,更不用说担心错过一个。许多 bug 是由未更改的缺失的值或执行不正确的 sed 命令引起的,它们希望捕获所有可能而不必手动寻找。

Bash 中,无论是在编写的脚本或在独立的文件中,定义函数和使用它们一样简单。如果将函数保存到独立的文件中。那么可以将它 source 到脚本中,就像 include C 语言或 C++ 中的库或将模块 importPython 中一样。要创建一个 Bash 函数,请使用关键字 function

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function foo {
# code here
}

这是一个如何在函数中使用参数的例子(有些人为设计,因此可能会更简单):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env bash
ARG=$1

function mimic {
  if [[ -z $ARG ]]; then
    ARG='world'
  fi
  echo "hello $ARG"
}

mimic $ARG

结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ./mimic
hello world
$ ./mimic everybody
hello everybody

请注意脚本的最后一行,它会执行该函数。对于编写脚本的新手来说,这是一个普遍的困惑点:函数不会自动执行。它们作为潜在的例程存在,直到被调用。

如果没有调用该函数,那么函数只是被定义,并且永远不会运行。

如果你刚接触 Bash,请尝试在包含最后一行的情况下执行示例脚本一次,然后在注释掉最后一行的情况下再次执行示例脚本。

使用函数

即使对于简单的脚本,函数也是很重要的编程概念。你越适应函数,在面对一个不仅需要声明性的命令行,还需要更多动态的复杂问题时,你就会越容易。将通用函数保存在单独的文件中还可以节省一些工作,因为它将帮助你建立常用的程序,以便你可以在项目间重用它们。看看你的脚本习惯,看是否适合使用函数。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
十个例子让你了解 strace 的使用技巧
tcpdump 作为计算机网络排查的一大神器,掌握了上文所说的技巧,可以让你随时随地得心应手的掌握网络应用的一举一动。
用户3147702
2022/06/27
4.9K0
十个例子让你了解 strace 的使用技巧
df 和 ls 命令执行夯主
其实他说第二点问题的时候我就已经猜到问题所在了,那不就是远程挂载的磁盘非正常的掉了,然后就会造成这个问题。但是他说 ISCSI 这个玩意的时候我不知道是啥,于是查了一下,有兴趣的同学可以看看这是:https://zhuanlan.zhihu.com/p/60986068,看的出来他是一个网络存储,那么就更加坚定我的想法了,开始指挥解决问题。
张琳兮
2020/05/25
2.1K0
df 和 ls 命令执行夯主
线程的创建以及线程的本质
上节详细学习了进程的创建,通过实例学习了fork和vfork的区别。本节将学习线程的创建,只涉及应用层的线程,内核线程的创建在后面学习。
DragonKingZhu
2020/03/24
1.7K0
线程的创建以及线程的本质
使用golang的net包进行域名解析过程分析
我们都知道,在计算机的世界,建立连接都是需要依靠五元组的(源ip,源端口,目的ip,目的端口,协议),而在实际用户使用过程中,浏览器会帮我们识别和管理源ip和端口以及协议(http,https),协议确定后其实目的端口也就确定了(80或443). 因此整个DNS系统要解决的问题就是将用户在浏览器中输入的域名最终转换成可识别的目的ip,进而进行连接通信。下面以一个简单例子来分析下dns解析的过程.
BGBiao
2019/09/11
13.6K0
这条命令有可能断送DBA职业生涯,我今天真的执行了
这个是从库,没有读业务和其他下游同步,风险可控。但是大家还是要谨慎。我执行这个命令是因为我搜到的菜鸟教程的split命令案例错误导致我生成了大量小文件。没想到大名鼎鼎的菜鸟教程也会有问题,大家还用man或者tldr查看帮助手册吧。
DBA札记
2024/06/03
1230
这条命令有可能断送DBA职业生涯,我今天真的执行了
Linux系统下刨析hello world背后的秘密
linux系统上使用gcc生成可执行程序:gcc -g -W helloworld.c -o helloworld
Linux兵工厂
2023/02/28
6330
Linux系统下刨析hello world背后的秘密
futex验证_fulvic
#include <semaphore.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string.h>
全栈程序员站长
2022/11/08
3060
无法获取指向控制台的文件描述符 (couldn't get a file descriptor referring to the console)
最近收拾东西,从一堆杂物里翻出来尘封四年多的树莓派 3B 主机来,打扫打扫灰尘,接上电源,居然还能通过之前设置好的 VNC 连上。欣慰之余,开始 clone 我的 git 项目,为它们拓展一个新的平台。在执行 cnblogs 项目 (参考《博客园排名预测 》) 对应的绘图命令时,趋势图、预测图是生成了,但没有自动打开图片,这个问题经过一番探索居然解决了,这篇文章就来分享一下解决问题的过程。
海海
2022/08/31
3.7K0
无法获取指向控制台的文件描述符 (couldn't get a file descriptor referring to the console)
Linux 进程管理
进程是 UNIX/Linux 用来表示正在运行的程序的一种抽象概念,所有系统上面运行的的数据都会以进程的形态存在。
用户1679793
2020/05/06
7.1K0
ls 不显示,rm 删不掉,怎么办?
有个叫atest的东西 ls -l atest 查不出来是什么 下面删也删不掉 但是可以用mv改名字,它放在/目录下,用ls /导致不能显示 如果操作,请大侠指点, 顺便问下什么时候会导致ls /   不显示,谢谢! # s
三杯水Plus
2018/11/14
1K0
sqlplus执行错误的问题探究
今天碰到个很诡异的问题,在装了Oracle Clinet的机器,不同路径下执行指令sqlplus,回显不同。
bisal
2020/07/25
8960
Swoole 4.4:支持 CURL 协程化
在4.4之前的版本中,Swoole一直不支持CURL协程化,在代码中无法使用curl。由于curl使用了libcurl库实现,无法直接hook它的socket,4.4版本使用Swoole\Coroutine\Http\Client模拟实现了curl的API,并在底层替换了curl_init等函数的C Handler。
猿哥
2019/06/12
6050
CVE-2021-44731 linux snap 本地提权漏洞分析
Snap是Canonical为使用Linux内核的操作系统开发的软件打包和部署系统。这些包(称为 snaps)和使用它们的工具 snapd 可在一系列 Linux 发行版中工作。
枪哥四海为家
2022/03/05
3.5K0
CVE-2021-44731 linux snap 本地提权漏洞分析
tools-tcp
如在我的电脑上strace -o 1.txt pkill goldendict,strace就给出了3287行的信息。。。如果加上参数-e trace=process,那么就只有4行:
Heeler-Deer
2023/02/22
4690
使用strace分析exp的奇怪问题(r3笔记第41天)
exp算是一个经典的数据导出工具了。对于小数量的表来说,个人还是比较钟爱exp。毕竟expdp还需要配置directory而且还在服务端。exp在数据量小的情况下速度还是很理想的。 关于exp导出的这个问题,已经拖了很久了,自己也排查了各种方法。通过查看wait event,查看exp的debug日志,都没有得出一些很有说服力的内容,今天下定决心来细细琢磨琢磨这个问题。有了一点收获。 之前在测试系统中碰到一个问题,导出一个比较大的分区表,分区数很多,其中有些分区里面没有数据,但是通过exp导出这些没有数据
jeanron100
2018/03/14
7880
Swoole v4.7 版本预览之支持 c-ares
c-ares 是一个异步 DNS 解析库。它适用于需要在不阻塞的情况下执行 DNS 查询或需要并行执行多个 DNS 查询的应用程序。
沈唁
2021/07/23
8110
Linux 内核监控在 Android 攻防中的应用
在日常分析外部软件时,遇到的反调试/反注入防护已经越来越多,之前使用的基于 frida 的轻量级沙盒已经无法满足这类攻防水位的需要,因此需要有一种更加深入且通用的方式来对 APP 进行全面的监测和绕过。本文即为对这类方案的一些探索和实践。
evilpan
2023/02/12
3.2K0
Linux 内核监控在 Android 攻防中的应用
故障分析 | 哪些情况下 MySQL 配置文件会被截断?
作者:龚唐杰,爱可生 DBA 团队成员,主要负责 MySQL 技术支持,擅长 MySQL、PG、国产数据库。
爱可生开源社区
2024/10/10
1740
故障分析 | 哪些情况下 MySQL 配置文件会被截断?
10张图22段代码,万字长文带你搞懂虚拟内存模型和malloc内部原理
摊牌了,不装了,其实我是程序喵辛苦工作一天还要回家编辑公众号到大半夜的老婆,希望各位大哥能踊跃转发,完成我一千阅读量的KPI(梦想),谢谢!
C语言与CPP编程
2020/12/02
2060
10张图22段代码,万字长文带你搞懂虚拟内存模型和malloc内部原理
Linux内存映射函数mmap与匿名内存块
gcc -o main1 -Wall -g -ggdb -O0 -g3 -gdwarf-2 main1.c
mingjie
2022/11/28
2.3K0
Linux内存映射函数mmap与匿名内存块
推荐阅读
相关推荐
十个例子让你了解 strace 的使用技巧
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档