文档章节

Shell编程(六) : Shell 函数 和 定向输出

AHUSKY
 AHUSKY
发布于 06/22 19:37
字数 1546
阅读 20
收藏 2
点赞 0
评论 0

Shell 常用函数

  • 简洁:目前没怎么在Shell 脚本中使用过函数,哈哈,不过,以后可能会用。就像java8的函数式编程,以后获取会用吧,行吧,那咱们简单的看一下具体的使用

Shell函数格式

linux shell可以用户定义函数,然后在shell脚本中可以随便调用

[ function ] funname [()]

{
    action;
    [return int;]

}
  • 说明
      1. 可以带funciton()定义,也可以直接fun()定义,不带任何参数。
      1. 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)。

看一个实例,试着套用一下格式

  • 例子1(无返回值)
#!/bin/bash
# author:husky
# url:=my.oschina.net/ahusky

demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

运行结果,你懂得,还是看看吧:

-----函数开始执行-----
这是我的第一个 shell 函数!
-----函数执行完毕-----
  • 例子2(包含返回值)
funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

运行结果如下:

这个函数会对输入的两个数字进行相加运算...
输入第一个数字: 
1
输入第二个数字: 
2
两个数字分别为 1 和 2 !
输入的两个数字之和为 3 !

函数返回值在调用该函数后通过 $? 来获得。

注意:所有函数使用前必须定义。这意味着必须将函数放在脚本开始部分,直到shell解释器首次发现它时,才可以使用。 调用函数仅使用函数名即可。

函数参数

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...

  • 带参数的函数示例:
funWithParam(){
	echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 '你好' 3 4 5 6 7 8 9 34 73

输出结果:

第一个参数为 1 !
第二个参数为 你好 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 你好 3 4 5 6 7 8 9 34 73 !

注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

Shell输入/输出重定向

这个标题花里胡哨了,通俗的讲就是,因CLI中输入的命令而在CLI所产生的输入结果的 输出,这个输出一般是 CLI界面,当然,也可以是输出到指定的文件中。

重定向命令列表如下:

命令说明
command > file将输出重定向到 file。
command < file将输入重定向到 file。
command >> file将输出以追加的方式重定向到 file。
n > file将文件描述符为 n 的文件重定向到 file。
n >> file将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m将输出文件 m 和 n 合并。
n <& m将输入文件 m 和 n 合并。
<< tag将开始标记 tag 和结束标记 tag 之间的内容作为输入。

输出重定向

重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:

command1 > file1

上面这个命令执行command1然后将输出的内容存入file1。

注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。

  • 实例

执行下面的 who 命令,它将命令的完整的输出重定向在用户文件中(users):

$ who > users

执行后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的文件。

你可以使用 cat 命令查看文件内容:

$ cat users
_mbsetupuser console  Oct 31 17:35 
tianqixin    console  Oct 31 17:35 
tianqixin    ttys000  Dec  1 11:33 

输入重定向

和 输出重定向相反,Unix命令也可以从文件中获取输入,语法为:

 command1 < file1

这样,本来需要从键盘输入的命令会转义到文件读取内容。 注意:输出重定向是大于号(>),输入重定向是小雨号(<)。

  • 实例

统计users文件的行数,执行以下命令

wc -l users

重定向深入讲解

一般情况下,每个Unix/Linux命令运行时都会打开三个文件:

  • 标准输入文件(stdin):stdin的文件描述为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout的文件描述为1,Unix程序默认向stdout输出数据
  • 标准错误文件(stderr):stderr的文件描述为2,Unix程序会向stderr流中写入错误信息

默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。

如果希望 stderr 重定向到 file,可以这样写:

$ command 2 > file 或者
$ command 2 >> file

标准错误文件(stderr) 如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:

$ command > file 2>&1

或者

$ command >> file 2>&1

如果希望对 stdin 和 stdout 都重定向,可以这样写:


$ command < file1 >file2

command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。

© 著作权归作者所有

共有 人打赏支持
AHUSKY
粉丝 10
博文 28
码字总数 70093
作品 0
海淀
程序员
学习理解shell的好办法--编写自己的shell 之一

本文参考自《Unix/Linux编程实践教程》, 这是一本讲解unix系统编程的书,注重实践,理解难度不大,推荐大家阅读,敲完本书后,对于理解unix系统如何运作会有更深的视角,回过头再学习别的 Li...

好铁
2014/07/29
0
0
Linux Shell常用技巧(十一) 交互式使用shell

二十二. 交互式使用Bash Shell: 1. 用set命令设置bash的选项: 下面为set主要选项的列表及其表述: #打开该选项 /> set -o allexport #等同于set -a #关闭该选项 /> set +o allexport #等同于...

长平狐
2012/08/27
124
0
Linux Shell编程学习笔记(一)变量和文件描述符

看了<Unix的设计思想>,情不自禁希望重新学习我曾经忽视的linux的shell脚本编程。我并不是随波逐流,也不是那种顽固的技术党,只是很纯粹的想了解这么技术,如果你有什么好的想法,也可以跟我交流...

-非墨-
2014/01/06
0
0
Linux Shell常用技巧(十一) 交互式使用shell

二十二. 交互式使用Bash Shell: 1. 用set命令设置bash的选项: 下面为set主要选项的列表及其表述: #打开该选项 /> set -o allexport #等同于set -a #关闭该选项 /> set +o allexport #等同于...

长平狐
2012/09/06
32
0
用PHP挑战在线编程题

今天想在Sphere Online Judge中用PHP来在线挑战一些题目,要用到标准输入输出,但最近在写php又不想用c来写,平时写项目都是表单提交,还真没有考虑过这个,于是看了下文档。 文档在此:http...

Jimmy
2017/08/21
0
0
Shell 函数 和 Shell echo命令 和 test命令

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。 shell中函数的定义格式如下: [ function ] funname [()] { action; [return int;] } 说明: 1、可以带function fun() 定义...

余二五
2017/11/16
0
0
Linux Shell常用技巧(十二) Shell编程

二十三. Bash Shell编程: 1. 读取用户变量: read命令是用于从终端或者文件中读取输入的内建命令,read命令读取整行输入,每行末尾的换行符不被读入。在read命令后面,如果没有指定变量名,读...

长平狐
2012/08/27
264
0
Linux Shell常用技巧(十二) Shell编程

二十三. Bash Shell编程: 1. 读取用户变量: read命令是用于从终端或者文件中读取输入的内建命令,read命令读取整行输入,每行末尾的换行符不被读入。在read命令后面,如果没有指定变量名,读...

长平狐
2012/09/06
77
0
shell的输入与输出

不好意思,今天发现高阶例子的解释中有个错误,同时也修改了一下全文。(2004-4-18) 首先,感谢网中人、r2007、lightspeed等诸位前辈的无私指导!以下的一些结论可能有错,还请各位前辈多...

zt371
2009/05/06
1K
0
Shell脚本入门-2

(一)定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: your_name="runoob.com" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名...

Avner
03/06
7
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Weblogic问题解决记录

问题:点击登录,页面刷新但是不进去管理界面。解决:删除cookies再登录。

wffger
14分钟前
0
0
RxJava2的错误处理方案

最近使用retrofit2 + rxKotlin2写接口访问,想尽量平铺代码,于是就想到当借口返回的状态码为「不成功」时(比如:code != 200),就连同网络错误一起,统一在onError方法中处理。想法总是好的...

猴亮屏
21分钟前
0
0
程序的调试信息

调试二进制程序时,经常要借助GDB工具,跟踪程序的执行流程,获取程序执行时变量的值,以发现问题所在。GDB能得到这些信息,是因为编译程序时,编译器保存了相应的信息。Linux下的可执行程序...

qlee
44分钟前
0
0
应用级缓存

缓存命中率 从缓存中读取数据的次数与总读取次数的比例,命中率越高越好 java缓存类型 堆缓存 guavaCache Ehcache3.x 没有序列化和反序列化 堆外缓存ehcache3.x 磁盘缓存 存储在磁盘上 分布式...

writeademo
今天
0
0
python爬虫日志(3)find(),find_all()函数

1.一般来说,为了找到BeautifulSoup对象内任何第一个标签入口,使用find()方法。 以上代码是一个生态金字塔的简单展示,为了找到第一生产者,第一消费者或第二消费者,可以使用Beautiful Sou...

茫羽行
今天
0
0
java:thread:顺序执行多条线程

实现方案: 1.调用线程的join方法:阻塞主线程 2.线程池 package com.java.thread.test;public class MyThread01 implements Runnable {@Overridepublic void run() {Syste...

人觉非常君
今天
0
0
ElasticSearch 重写IK分词器源码设置mysql热词更新词库

常用热词词库的配置方式 1.采用IK 内置词库 优点:部署方便,不用额外指定其他词库位置 缺点:分词单一化,不能指定想分词的词条 2.IK 外置静态词库 优点:部署相对方便,可以通过编辑指定文...

键走偏锋
今天
19
0
Git 2.18版本发布:支持Git协议v2,提升性能

Git 2.18版本发布:支持Git协议v2,提升性能Git 2.18版本发布:支持Git协议v2,提升性能 新版本协议的主要驱动力是使 Git 服务端能够对各种 ref(分支与 tag)进行过滤操作。 这就意味着,G...

linux-tao
今天
0
0
python浏览器自动化测试库【2018/7/22-更新】

64位py2.7版本 更新 document_GetResources 枚举页面资源 document_GetresourceText 获取指定url的内容 包括页面图片 下载地址下载地址 密码:upr47x...

开飞色
今天
42
0
关于DCL双重锁失效及解决方案

关于DCL双重锁失效及解决方案 Double Check Lock (DCL)实现单例 DCL 方式实现单例的优点是既能够在需要时才初始化单例,又能够保证线程安全,且单例对象初始化后调用getInstance方法不进行...

DannyCoder
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部