文/一介书生,一枚码农。

scripts are for lazy people.

函数是存在内存里的一组代码的命名的元素。函数创建于脚本运行环境之中,并且可以执行。

函数的语法结构为:

function <function-name> {
<code to execute>
}

创建函数不需要dodone这些关键字,只需要大括号来界定函数的作用范围。

我们可以在命令行中创建一个简单的函数:

function show_system {
echo "The uptime is:"
uptime
echo echo "Current dir:"
pwd
echo echo "Date:"
date
}

在命令行定义上面的函数:

然后执行函数:

最后,我们可以使用type命令查看函数的定义:

方法可以有传递的参数。在此之前,我们先简单介绍 sed命令,下面的脚本用来移除文件中的注释行和空白行。

sed -i.bak '/^\s*#/d;/^$/d' <filename>

详细介绍一下上面的脚本:

  • sed -i.bak:sed 命令会创建一个以.bak结尾的备份文件,用来备份原始的文件。
  • /^:表示行首。
  • \s*:匹配任何不可见字符,包括空格、制表符、换页符等。
  • #/:shell 脚本中的注释标记。 /^\s*#/一起使用用来查找注释行和带有不可见字符的注释行。
  • d:用来删除匹配的行。
  • ;/^$/d;是表达式的分隔符,后面的表达式跟前面的表达式意思很像,用来删除空白行, "$"匹配输入字符串的结束位置。

我们把上面的脚本移到函数中,创建一个名为clean_file的函数:

function clean_file {
sed -i.bak '/^\s*#/d;/^$/d' "$1"
}

上面的代码中,我们使用位置参数$1来接收命令行里传递的参数,需要注意的是$1 用大括号来括起来。

下面,我们完善clean_file方法,新建一个脚本文件 clean.sh。代码如下:

#!/bin/bash
# Script will prompt for filename
# And remove commented and blank lines function is_file {
if [ ! -f "$1" ] ; then
echo "$1 does not seem to be a file"
exit 2
fi
} function clean_file {
is_file "$1"
BEFORE=$(wc -l "$1")
echo "The file $1 starts with $BEFORE"
sed -i.bak '/^\s*#/d;/^$/d' "$1"
AFTER=$(wc -l "$1")
echo "The file $1 is now $AFTER"
} read -p "Enter a file to clean: "
clean_file "$REPLY"
exit 1

其中,wc -l命令用来打印文件行数。

现在,我们新建一个用来测试的文件 test.txt,里面随便写些内容:

# This file is just for testing.

Hello.

World.

# new comment.

$

The end.

在 test 文件所在的目录下,执行 clean.sh脚本:

然后查看 test 文件和 test.bak 文件,发现空白行和注释行已经删除。

这里需要注意的是,shell 脚本是从上至下来执行的,如果在一个函数中调用了另一个函数,那么被调用的函数要定义在调用函数的前面。

当然,除了函数可以传递参数外,还可以有返回值。默认情况下,在执行完函数内的最后一行代码后,方法会返回一个状态的数字,你可以使用$?变量来查看函数执行的状态。如果返回值为0,表示方法正常退出,非0表示程序发生错误或其他非正常退出。

我们使用return关键字来返回一个整数。这里需要注意两点:

  • 函数一旦执行完就会返回状态代码。
  • 状态代码的范围为0到255。

如果不想返回函数的状态代码,而是想返回一个字符串或是其他类型,可以使用 echo 变量的方式来返回值。

下面创建脚本文件 translate.sh,用来把文件中的大写字符转换为小写字符:

#!/bin/bash
# Script that translates upper letter to low letter function to_lower ()
{
input="$1"
output=$(tr '[A-Z]' '[a-z]' <<< "$input")
echo $output
} while true
do
read -p "Enter c to continue or q to exit: "
result=$(to_lower $REPLY)
echo "After translate: $result" if [ $result = "q" ] ; then
break
fi done
echo "Finished"

代码会把输入的大写字符变成小写字符,当输入"Q"或"q"时程序退出。

Linux Shell——函数的使用的更多相关文章

  1. Linux Shell函数定义与调用

    一.Shell函数定义格式 shell函数定义格式,各部分说明如下: [ function ]等中括号括起来部分----表示可选(即可有可无) your_function_name部分----为函数名 ...

  2. Linux Shell函数返回值

    转:http://blog.csdn.net/ithomer/article/details/7954577 Shell函数返回值,一般有3种方式:return,argv,echo 1) return ...

  3. Linux Shell 函数返回值

    Shell函数返回值,常用的两种方式:return,echo 1) return 语句 shell函数的返回值,可以和其他语言的返回值一样,通过return语句返回. 示例: #!/bin/sh fu ...

  4. linux shell 函数返回值问题(超过255)

    最近再写一个shell测试的时候出现问题,函数返回值异常 用shell计算斐波那契数列数列,写了一个shell函数,然后调用的,验证的时候我只随便计算了几个数(10以内),确认结果是正确的就提交了,后 ...

  5. Linux Shell函数

    200 ? "200px" : this.width)!important;} --> 介绍 正文 $? $?是shell变量,表示"最后一次执行命令"的 ...

  6. Linux shell 函数应用示例01

    函数Function的使用 定义函数 (1) 函数名称() {     ...     ... } (2) function 函数名称{     ...     ... } 调用函数         ...

  7. Linux shell 函数应用示例02

    nginx服务控制脚本: 安装ngix [root@wei function]# yum install gcc pcre-devel openssl-devel [root@wei function ...

  8. linux shell自定义函数(定义、返回值、变量作用域)介绍

    http://www.jb51.net/article/33899.htm linux shell自定义函数(定义.返回值.变量作用域)介绍 linux shell 可以用户定义函数,然后在shell ...

  9. 转 linux shell自定义函数(定义、返回值、变量作用域)介绍

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...

随机推荐

  1. 安卓Android的内存管理原理解析

    Android采取了一种有别于Linux的进程管理策略,有别于Linux的在进程活动停止后就结束该进程,Android把这些进程都保留在内存中,直到系统需要更多内存为止.这些保留在内存中的进程通常情况 ...

  2. 用python抓取求职网站信息

    本次抓取的是智联招聘网站搜索“数据分析师”之后的信息. python版本: python3.5. 我用的主要package是 Beautifulsoup + Requests+csv 另外,我将招聘内 ...

  3. web从入门开始(5)-----表单

    1.   表单的概念 是用来获取客户端用户数据的(信息)的.如:注册表单,查询表单,登录表单等. 2.  表单的工作原理 1.浏览有表单的网页,填写一些必要的信息,然后单击某个按钮,进行提交. 2.这 ...

  4. 谈谈Backbone.js中的el

    小编最近开始接触backbone.js,这个曾经非常优秀的一款MVC前端框架,在学习的过程中,遇到下图的这样一个问题 下面上代码 小编的想法很简单,只是view了一个实例,然后在initalize中调 ...

  5. X-Scan使用教程

    下载X-Scan扫描器,解压缩,双击Xscan_gui.exe即可运行,不需要安装.X-Scan采用多线程的方式,对指定主机或者网段进行扫描. 其扫描功能(插件)有: 开放服务:扫描TCP端口状态,根 ...

  6. php人员权限管理(RBAC)

    在说权限管理前,应该先知道权限管理要有哪些功能: (1).用户只能访问,指定的控制器,指定的方法 (2).用户可以存在于多个用户组里 (3).用户组可以选择,指定的控制器,指定的方法  (4).可以添 ...

  7. centos 6.5 搭建JSP运行环境

    一.安装nginx yum install nginx #安装nginx,根据提示,输入Y安装即可成功安装 service nginx start #启动 chkconfig nginx on #设为 ...

  8. 分布式统一配置平台-Disconf.Net

    源码地址:https://github.com/qkbao/Disconf.Net 作者:青客宝  联系qq:后续奉上 为了更好的解决分布式环境下多台服务实例的配置统一管理问题,本文提出了一套完整的分 ...

  9. cassandra高级操作之JMX操作

    需求场景 项目中有这么个需求:统计集群中各个节点的数据量存储大小,不是记录数. 一开始有点无头绪,后面查看cassandra官方文档看到Monitoring章节,里面说到:Cassandra中的指标使 ...

  10. C#中string和byte[]相互转换问题解决

    本来想讲string转换为byte数组,通过在VS上打 ‘str. “来找,结果半天没发现跳出来的函数中有想要的,哭瞎 /(ㄒoㄒ)/~~ 这回将两种情况都记下来了.... string ---> ...