`
su1216
  • 浏览: 676733 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
深入入门正则表达式(jav...
浏览量:72623
E60283d7-4822-3dfb-9de4-f2377e30189c
android手机的安全问...
浏览量:129445
社区版块
存档分类
最新评论

《Linux命令行与shell脚本编程大全》 第十六章 学习笔记

阅读更多

 

第一部分:Linux命令行
《Linux命令行与shell脚本编程大全》 第一章:初识Linux shell
《Linux命令行与shell脚本编程大全》 第二章:走进shell
《Linux命令行与shell脚本编程大全》 第三章:基本的bash shell命令
《Linux命令行与shell脚本编程大全》 第四章:更多的bash shell命令
《Linux命令行与shell脚本编程大全》 第五章:使用Linux环境变量
《Linux命令行与shell脚本编程大全》 第六章:理解Linux文件权限
《Linux命令行与shell脚本编程大全》 第七章:管理文件系统
《Linux命令行与shell脚本编程大全》 第八章:安装软件程序
《Linux命令行与shell脚本编程大全》 第九章:使用编辑器

第二部分:shell脚本编程基础
《Linux命令行与shell脚本编程大全》 第十章:构建基本脚本
《Linux命令行与shell脚本编程大全》 第十一章:使用结构化命令
《Linux命令行与shell脚本编程大全》 第十二章:更多的结构化命令
《Linux命令行与shell脚本编程大全》 第十三章:处理用户输入
《Linux命令行与shell脚本编程大全》 第十四章:呈现数据
《Linux命令行与shell脚本编程大全》 第十五章:控制脚本

第三部分:高级shell编程
《Linux命令行与shell脚本编程大全》 第十六章:创建函数
《Linux命令行与shell脚本编程大全》 第十七章:图形化桌面上的脚本编程
《Linux命令行与shell脚本编程大全》 第十八章:初识sed和gawk
《Linux命令行与shell脚本编程大全》 第十九章:正则表达式
《Linux命令行与shell脚本编程大全》 第二十章:sed进阶
《Linux命令行与shell脚本编程大全》 第二十一章:gawk进阶
《Linux命令行与shell脚本编程大全》 第二十二章:使用其他shell

第四部分:高级shell脚本编程主题
《Linux命令行与shell脚本编程大全》 第二十三章:使用数据库
《Linux命令行与shell脚本编程大全》 第二十四章:使用Web
《Linux命令行与shell脚本编程大全》 第二十五章:使用E-mail
《Linux命令行与shell脚本编程大全》 第二十六章:编写脚本实用工具
《Linux命令行与shell脚本编程大全》 第二十七章:shell脚本编程进阶

 

第十六章:创建函数

 

基本的脚本函数

创建函数

1.用function关键字,后面跟函数名

function name {
    commands
}

2.函数名后面跟空圆括号,标明正在定义一个函数

name() {
   commands
}

如果两个函数的名称相同,那么后面的将会覆盖前面的,而且不会有提示。

使用函数

使用函数名称即可。必须先定义,再使用。

#!/bin/bash
f1() {
    echo "this is f1."
}
f1

function f1 {
    echo "this is f1111."
}
f1

f2
f2() {
    echo "this is f2."
}

这里首先定义了f1,然后执行,然后又定义了一个f1,再执行。发现第二次执行的是新的f1函数。

接着调用f2,由于此时f2还没有定义,所以会调用失败。

$ function_test 
this is f1.
this is f1111.
./function_test: line 12: f2: command not found

返回值

bash shell会把函数当做小型脚本,运行结束时会返回一个退出状态码。

有三种方式生成函数退出状态码

默认退出状态码

默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码

函数执行结束后,可以使用$?变量来决定函数的退出状态码

#!/bin/bash
fun(){
    ls nothing
    echo $?
    echo "done"
}

fun
echo "fun:$?"

由于ls找不到nothing文件或者目录,所以返回的状态码=2

但是fun函数最后的echo执行成功了,所以fun返回的状态码=0

$ function_test 
ls: cannot access nothing: No such file or directory
2
done
fun:0

使用函数默认退出状态码是很危险的……

 

使用return命令

bash shell使用return命令退出函数并返回特定的退出状态码。

return命令允许指定一个整数值来定义函数的退出状态码

注意:函数一结束就取返回值,退出状态码必须在0-255之间。

使用函数输出

可以将函数的输出保存到变量中,例如:

result=`f1`

bash shell不会将read读取输入的部分作为 STDOUT

 

在函数中使用变量

向函数传递参数

在脚本中指定函数时,必须将参数和函数放在同一行

然后函数可以用参数环境变量来获得参数值

在函数中处理变量

函数会用到全局变量和局部变量。

全局变量

在脚本中定义的所有变量均为全局变量。

#!/bin/bash
var=1
fun(){
    echo "var:"$var
    var2=2
}

fun
echo "var2:"$var2

输出:

$ function_test 
var:1
var2:2

局部变量

函数内部任何变量都可以声明为局部变量,只需在变量前加local关键字即可。

在脚本中定义的局部变量,函数中是无法访问的。

 

数组变量和函数

向函数传递数组参数

需要将数组变量的值分解成单个值,然后作为函数参数使用。

在函数内部,可以将他们再组成一个数组。

#!/bin/bash
array=(a b c d)

fun(){
    newarray=($@) #重新组合为数组
    echo "newarray is:"${newarray[*]} #打印数组
    echo "The 3rd element is:"${newarray[3]}
}

fun ${array[*]} #拆分成多个值传入

输出:

$ function_test 
newarray is:a b c d
The 3rd element is:d

如果试图将数组当做一个参数传递给函数,那么函数只会读取数组变量的第一个值。

#!/bin/bash
array=(a b c d)

fun(){
    echo "We have "$#" parameter(s)."
    echo "They are: "$@
    echo "They are: "$*
}

fun $array

fun函数只认识数组中的第一个元素

$ function_test 
We have 1 parameter(s).
They are: a
They are: a

从函数返回数组

#!/bin/bash
fun(){
    local array=(a b c d)
    echo ${array[*]}
}

array=(`fun`)
echo ${array[2]}

同返回普通字符串类似,按顺序echo输出,然后放在圆括号里面即可。

 

函数递归

还是以最简单的求N的阶乘为例:

#!/bin/bash
fun(){
    local result=1;
    if [ $1 -eq 1 ]
    then
        echo 1
    else
        result=$[$1 * `fun $[$1 - 1]`]
        echo $result
    fi
}

fun $1

没有新的知识点,只是不太熟悉罢了

如果使用了``,那么函数内的echo就不会输出到STDOUT了,和上面其他的例子一样。

 

创建库

source命令可以在当前的shell上下文中执行命令,而不是创建一个新的shell来执行命令。可以用source命令来在shell脚本中运行库文件脚本。

source命令等同于点操作符(dot operator)

在一个名叫lib_test的文件中定义一个plus函数

#!/bin/bash
plus(){
    if [ $# -ne 2 ]
    then
        echo "I need 2 numbers!"
        return
    fi
    echo $[$1 + $2]
}

然后我们在另一个脚本中使用它

#!/bin/bash
. lib_test #脚本路径
plus $1 $2

使用方法很简单,这样就相当于把lib_test导入到当前文件中了

$ function_test 4 5
9

在命令行上使用函数

在命令行上创建函数

由于在键入命令时shell就会解释命令,所以可以在命令上直接定义函数。

$ plus(){ echo $[$1 + $2]; }
$ plus 3 1
4

注意:要在花括号两边加空格,每条命令用分号隔开。

下面的方法看起来更实用一些,效果也更好

$ plus(){
> echo $[$1 + $2]
> }
$ plus 4234 23
4257

无须分号和空格。

在.bashrc文件中定义函数

可以直接在这里定义函数,也可以使用source命令,导入库

注意,修改了.bashrc之后要重启才能生效

如果不是每次开机都要执行,那我们还可以在shell中直接使用source,很多时候,这种方式可能更好一些。

 

 

 

转贴请保留以下链接

本人blog地址

http://su1216.iteye.com/

http://blog.csdn.net/su1216/

1
2
分享到:
评论

相关推荐

    总结搜集的shell脚本学习笔记(完结篇).pdf

    ### Shell脚本编程知识点概述 #### 一、预备知识与基本概念 在开始Shell脚本文档的学习之前,首先需要理解Shell脚本的基本概念及其在Linux/Unix环境中的作用。Shell是一种命令行解释器,用于执行用户输入的命令,...

    尚观linux 学习笔记 1

    4. "ule_06.txt" - 可能介绍了第六单元的Shell脚本编程,包括基本的Shell命令,变量、条件语句、循环结构、函数定义以及如何编写自动化任务脚本。 5. "ule_9.txt" - 可能是第九单元,可能讨论了网络配置和管理,...

    Linux学习笔记.pdf,linux详解,LINUX

    八、shell脚本编程 编写shell脚本可以自动化重复任务,例如: - 变量、运算符和条件判断。 - 函数定义。 - 循环结构。 - 输入输出重定向。 九、系统管理 - sysctl:调整系统内核参数。 - logrotate:日志文件轮换。...

    Linux初学者shell入门

    Linux Shell编程是Linux系统管理与自动化任务的核心技能...了解这些基础概念和命令后,Linux Shell编程的门已经打开,接下来可以深入学习条件语句、循环、函数等更高级的Shell脚本编写技巧,以实现更复杂的自动化任务。

    嵌入式Linux 入门笔记Linux.pdf

    - **Shell脚本**:了解如何编写简单的Shell脚本来自动化任务。 **2. Minicom的使用** - **串口通信**:Minicom是一个用于串行通信的终端仿真器,适用于与开发板或其他串行设备进行通信。 - **配置设置**:学会如何...

    第11章 Linux操作系统基础-教程与笔记习题

    以下是对"第11章 Linux操作系统基础"的主要知识点的详细阐述。 一、Linux操作系统简介 Linux是基于Unix的操作系统,由林纳斯·托瓦兹于1991年创建。它的内核是开源的,允许全球开发者对其进行修改和优化。Linux系统...

    Redhat系统管理员笔记

    - **变量与参数(Variable & Parameter)**:讲解如何在Shell脚本中定义和使用变量。 - **变量替换(Variable Substitution)**:介绍如何使用变量替换功能。 - **正则表达式(Regular Expression)**:探讨Shell脚本中正...

Global site tag (gtag.js) - Google Analytics