Linux——shell脚本基础3:shell函数【参数传递及输入输出】&内置函数

函数定义 1

退出状态 1

参数传递 2

标准IO 2

脚本调试 2

AND&OR 3

内置命令补充 3

函数定义

函数定义:

在Shell 中,函数就是一组命令集或语句形成一个可用块

函数增强了shell的可编程能力

组成

function_name(){

statements

}

函数名(在一个脚本中必须唯一)

函数体(命令集合)

注意

shell中不存在向前声明(先定义后使用)

必须在调用一个函数之前对它进行定义

函数可以定义自己内部使用的变量:local

像使用命令一样调用函数

eg

function copyfile()

{

local srcfile=$1

local dstfile=$2

cp $srcfile $dstfile

return 0   # always return success

}

copyfile /tmp/myconf /etc/sysconf

调用

function_name params

可以通过return命令让函数返回数字值,或者echo一个字符串返回

参数传递

参数传递:

参数使用与位置参数一样

$1, $2, ……

$@, $*

$#

func $var1 $var2

注:变量中间用空格、Tab分割

返回值

return:主要用来返回退出状态,即$?

0 <= 返回值(整数) <= 255;

0 为无错误;

非0 为有错误;

注:如果返回其他数据,可以使用echo或者全局变量

return_var=`func $var1 $var2`

退出状态

退出状态(exit status):

函数返回一个被称为退出状态的值. 退出状态可以由return 来指定statement, 否则函数的退出状态是函数最后一个执行命令的退出状态(0 表示成功,非0 表示出错代码).

可以在脚本中由$? 引用

退出值为 0 表示成功

退出值非 0 表示失败

当一个命令因为严重的信号 N 退出时,bash 将使用 128+N 作为它的退出状态

出现一个信号

128及以上

严重的信号 N 退出

命令没找到:

127

文件找到但不可执行:

126

展开或重定向中的错误:脚本程序可使用的错误代码

1-125

所有的内建命令在用法错误时返回

2

成功

0

内置命令补充

内置命令补充:

:命令

冒号(:)是一个空命令,偶尔用于简化条件逻辑,相当于true的一个别名。

例如 while :

也用于在变量的条件设置中

例如 : ${var:=value}

if ….;then

:

fi

.命令

用于在当前shell中执行命令

. ./shell_script

相当于source命令

在执行脚本程序中列出的命令时,使用的是调用该脚本程序的同一个shell

续行符\[enter]

必须是行的最后一个字符  用于统一命令跨多行

echo命令

输出结尾带有换行符的字符串

echo –n “string to output”              bash风格去换行符

eval命令

允许对参数进行求值,是shell的内置命令

即允许代码被随时生成和运行

exec命令

两种用法

典型:将当前shell替换为一个不同的程序

exec wall “Thanks for all the fish”

第二种用法修改当前文件描述符

exec 3 < afile

exit n命令

使脚本程序以退出码n结束运行

若是在脚本退出时不指定退出状态,那么该脚本最后一条被执行命令状态将被用作返回值

export命令

功能说明:设置或显示环境变量。

语  法:export [-fnp][变量名称]=[变量设置值]

参  数:

 -f  代表[变量名称]中为函数名称。

 -n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。

 -p  列出所有的shell赋予程序的环境变量

注意:

1、执行脚本时是在一个子shell环境运行的,脚本执行完后该子shell自动退出;

2、一个shell中的系统环境变量才会被复制到子shell中(用export定义的变量);

3、一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失(并不能返回到父shell中)。

4、不用export定义的变量只对该shell有效,对子shell也是无效的。

补充说明:

1.在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该此登陆操作。

2.

export把自己的参数创建为一个环境变量,而这个环境变量可以被当前程序调用的其他脚本和程序看见

被导出变量构成从该shell衍生的任何子进程的环境变量

expr命令

格式;  expr  argu  operator  argu    [必带空格]

将它的参数当做一个表达式来求值,最常见用法简单数学运算

x=`expr $x + 1`  注意,运算符两边空格必须

x=$(expr $x + 1)

例子:

1. 直接计算

$expr 10  +  10

$expr 30  /  3

$expr 30  \*  3    【必须转义】

2. 增量计算

$LOOP=10

$LOOP=`expr $LOOP + 1`     //反引号

3. 数值测试

可用expr测试是否为数字

$VALUE=12

$expr $VALUE + 10 > /dev/null 2>&1

$echo $?

0

4.  expr本身的退出状态

注:返回值与系统退出命令恰好相反

$VALUE=”hello”

$expr $VALUE = “hello”

1

$echo $?

0

5. 模式匹配及抽取

$VALUE=”hello”

$expr $VALUE : ‘.*’

5

抽取

$VALUE=”account.doc”

$expr $VALUE : ‘.∗.doc’

account

let命令

系统默认“+”是作为字符串处理的,因此它不会被作为一个操作符,而只是被识别为一个普通的字符串

使用let强制为数字

$ d=111

$ echo $d+1

111+1

$ let d=$d+1; echo $d

112

printf命令

格式化输出

d 十进制

C 一个字符

S 一个字符串

% 一个%字符

printf “%s\n” hello

printf “%s %d” “Hi” 6

return命令

使函数返回,可有一个数值参数,作为该函数的返回值,如果不带参数,return命令默认返回最后一条命令的退出码

set命令

为shell设置参数变量

set $(date)

echo The month is $2

即参数的值作为当前脚本参数列表了

shift命令

把所有参数变量左移一个位置,是$2->$1   $3->$2原来$1被丢弃,$0保持不变

可带参数表示左移一个数值参数

trap命令

用于指定接收到信号后要采取的行动

常见用途:在脚本程序被中断时完成清理工作

trap command signal

注:脚本程序通常是从上到下顺序解释执行的,必须在想保护那部分代码之前指定trap命令

HUP(1) 挂起,中断掉线或用户退出 引发

INT(2)中断 ctrl+c组合键发生

QUIT(3)退出,ctrl+\组合键发生

ABRT(6)中止,默写严重的执行错误引发

ALRM(14)报警,用来处理超时

TERM(15)终止,系统关机时发出

unset命令

从环境变量中删除变量或函数

不能删除shell本身定义的只读变量

FROM:  http://my.oschina.net/hanzhankang/blog/202724

shell函数【参数传递及输入输出】&内置函数的更多相关文章

  1. [JSP][JSTL]页面调用函数--它${fn:}内置函数、是推断字符串是空的、更换车厢

    页面中调用函数--之${fn:}内置函数 函数描写叙述 fn:contains(string, substring) 假设參数string中包括參数substring,返回true fn:contai ...

  2. Python 4 函数的参数,内置函数,装饰器,生成器,迭代器,

    一.函数的参数: 1.位置参数:调用函数时根据函数定义的参数位置来传递参数. 2.关键字参数:用于函数调用,通过“键-值”形式加以指定.可以让函数更加清晰.容易使用,同时也清除了参数的顺序需求. 3. ...

  3. 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

  4. Python--函数对象@命名空间与作用域@包函数@装饰器@迭代器@内置函数

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

  5. 跟着ALEX 学python day3集合 文件操作 函数和函数式编程 内置函数

    声明 : 文档内容学习于 http://www.cnblogs.com/xiaozhiqi/  一. 集合 集合是一个无序的,不重复的数据组合,主要作用如下 1.去重 把一个列表变成集合 ,就自动去重 ...

  6. Python-Day3知识点——深浅拷贝、函数基本定义、内置函数

    一.深浅拷贝 import copy #浅拷贝 n1={'k1':'wu','k2':123,'k3':['carl',852]} n2=n1 n3=copy.copy(n1) print(id(n1 ...

  7. 拷贝,集合,函数,enumerate,内置函数

    1.拷贝 字符串和数字.赋值 id一样 import copy #提供拷贝功能 copy.copy() #原来的和现在的一起修改,不用修改时用浅copy,节省内存,复制最外层 copy.deepcop ...

  8. Day3 - Python基础3 函数、递归、内置函数

    Python之路,Day3 - Python基础3   本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8. ...

  9. 第七篇 python基础之函数,递归,内置函数

    一 数学定义的函数与python中的函数 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因 ...

  10. day16 函数的用法:内置函数,匿名函数

    思维导图需要补全 : 一共有68个内置函数: #内置:python自带 # def func(): # a = 1 # b = 2 # print(locals()) # print(globals( ...

随机推荐

  1. CDQ分治求前缀和

    #include<bits/stdc++.h> using namespace std; ; int n,a_tot,q_tot,ans[N]; ]; struct query { int ...

  2. k8s 使用详解

    转自:https://www.cnblogs.com/gaoyuechen/p/8685771.html

  3. FZU 2150 Fire Game(双起点)【BFS】

    <题目链接> 题目大意: 两个熊孩子在n*m的平地上放火玩,#表示草,两个熊孩子分别选一个#格子点火,火可以向上向下向左向右在有草的格子蔓延,点火的地方时间为0,蔓延至下一格的时间依次加一 ...

  4. 算法进阶面试题01——KMP算法详解、输出含两次原子串的最短串、判断T1是否包含T2子树、Manacher算法详解、使字符串成为最短回文串

    1.KMP算法详解与应用 子序列:可以连续可以不连续. 子数组/串:要连续 暴力方法:逐个位置比对. KMP:让前面的,指导后面. 概念建设: d的最长前缀与最长后缀的匹配长度为3.(前缀不能到最后一 ...

  5. VB.NET只允许打开一个实例

    If UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) ...

  6. python——设计模式

    设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码.反之,设计模式更为高级,它是一种必须在特定情 ...

  7. U3D面试题

    直接上新.... 什么是协同程序?答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行.换句话说,开启协程就是开启一个可以与程序并行的逻辑.可以用来控制运动.序列以及对象的行为. Unity ...

  8. PHP Redis 对象方法手册

    redis(Remote Dictionary Server)是一种Nosql技术,它是一个开源的高级kv存储和数据结构存储系统. redis不仅仅是能够存储key和value这种简单的键值对,还能存 ...

  9. Shutting down CodePlex 03/31/2017

    Almost 11 years after we created CodePlex, it’s time to say goodbye.  We launched CodePlex in 2006 b ...

  10. 《es6标准入门》chapter11中关于Proxy的一个错误例子的纠正

    在原书第二版的p120,这里有一个使用Proxy实现管道化调用的例子,想法很好,但是代码有问题,下面是更正之后的代码. 由于我是在node环境下运行,所以我把几个全局函数定义到global内了,如果是 ...