Linux Shell基础篇七 - 函数
Shell编程和其他编程语言一样有函数,函数是由若干条shell命令组成的语句块,实现Shell脚本代码重用和模块化编程。
系统函数
即系统自带提供的函数,可以直接使用。
basename
basename函数用于获取文件名的函数,根据给出的文件路径截取出文件名。
1 |
|
示例:
1 |
|
dirname
从指定的文件绝对路径,去除文件名,返回剩下的前缀目录路径。
1 |
|
示例:
1 |
|
自定义函数
开发人员自定义的函数,实现代码重用。
1 |
|
- 函数名前面可以带
function
定义,也可以直接函数名()
定义,括号中不需带任何参数。 - 参数返回,可以加
return
显式返回,如果不加,将以最后一条命令运行结果作为返回值,return
后跟数值n,n的取值范围是0~255。
注意:必须在调用函数地方之前,先声明函数,shell脚本是逐行运行,只有先运行了函数,后面才可以使用函数。
示例:无参无返回值函数
1 |
|
示例:无参有返回值函数
1 |
|
示例:有参函数
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n
的形式来获取参数的值,例如,$1
表示第一个参数,$2
表示第二个参数…( $0
表示脚本文件名)。
其他参数介绍:
参数处理 | 说明 |
---|---|
$# | 传递到脚本或函数的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
1 |
|
Shell程序与函数的区别
函数和shell程序比较相似,区别在于:
- Shell 程序(内置命令或外部脚本文件)是在子Shell中运行,会开启独立的进程运行;
- Shell函数在当前Shell的进程中运行;
示例:
1 |
|
函数中的进程ID和当前脚本文件运行的shell进程ID是一样的,说明是同一个进程。
重定向输入输出
标准输入:从键盘读取用户输入的数据,然后再把数据拿到Shell程序中使用;
标准输出:Shell程序产生的数据,这些数据一般都是呈现到显示器上供用户浏览查看;
默认输入输出文件:每个 Unix/Linux 命令运行时都会打开三个文件,文件如下
文件名 | 类型 | 文件描述符(file description, fd) | 功能 |
---|---|---|---|
stdin | (standard input) 标准输入文件 |
0 | 获取键盘的输入数据 |
stdout | (standard output) 标准输出文件 |
1 | 将正确数据输出到显示器上 |
stderr | (standard error) 标准错误输出文件 |
2 | 将错误信息输出到显示器上 |
每个文件都有一个唯一的 文件描述符fd, 后面会通过唯一 文件描述符fd 操作对应的信息
Shell程序操作输入输出时用到这3个文件,这3个文件用于临时传输数据使用:
- Shell程序默认会从stdin文件中读取输入数据
- Shell程序默认会向stdout文件输出正确数据
- Shell程序默认会向stderr文件中输出错误信息
Linux Shell 重定向分为两种,一种输入重定向,一种是输出重定向:
- 标准输入是数据默认从键盘流向程序,如果改变了它的方向,数据就从其它地方流入,这就是输入重定向。
- 标准输出是数据默认从程序流向显示器,如果改变了它的方向,数据就流向其它地方,这就是输出重定向。
重定向的作用
输出重定向是指命令的结果不再输出到显示器上,而是输出到其它地方,一般是文件中。这样做的最大好处就是把命令的结果保存起来,当我们需要的时候可以随时查询。重定向语法如下:
命令 | 说明 |
---|---|
命令 > file | 将正确数据重定向输出到 file 文件中,覆盖方式 |
命令 < file | 将输入重定向从 file 文件中读取数据 |
命令 >> file | 将正确数据重定向输出到 file 文件中,追加方式 |
命令 < file1 > file2 | 从file文件读取数据,输出数据到file2文件中 |
命令 fd> file | 根据指定的文件描述符fd 将数据重定向输出到 file 文件中,覆盖方式 |
命令 fd>> file | 根据指定的文件描述符fd 将数据重定向输出到 file 文件中,追加方式 |
命令 > file fd1>& fd2 | 将 fd1 和 fd2 文件描述符合并输出到文件 |
fd1<& fd2 | 将 fd1 和 fd2 文件描述符合并从文件读取输入 |
<< tag | 读取终端输入数据, 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 标记名tag可以任意 |
- 在输出重定向中,
>
代表的是覆盖输出,>>
代表的是追加输出。 fd是文件描述符:
0 通常是标准输入(STDIN)
1 是标准输出(STDOUT)
2 是标准错误输出(STDERR)
- fd> 或 fd>> 中间不可以有空格
输出示例:正确信息重定向输出
1 |
|
输出示例:错误信息重定向输出
执行一条会产生错误的命令ls java
,没有java目录所以会报错。
将错误消息输出到error.log文件中:
1 |
|
2
是标准错误输出(STDERR),>
覆盖方式输出,注意fd与>符号之间不能有空格,所以这里是2>
。
输出示例:正确和错误信息同时输出
将正确信息与错误信息都保存到一个文件中
1 |
|
数字1
代表正确输出的结果输出到文件中,数字2
代表错误结果输出到文件中,2>& 1
将正确和错误都输出到文件中. 2>&
中间不能有空格,但是&
后面可以有空格,这2种都是正确写法:2>& 1
或者 2>&1
。
输入示例:统计文件数据行数
Linux wc 命令可以用来对文本进行统计,包括单词个数、行数、字节数等。
1 |
|
options有如下:
选项 | 含义 |
---|---|
-c |
character, 统计字节数 |
-w |
word, 统计单词数 |
-l |
line, 统计行数 |
-m |
统计字符数 |
-L |
显示最长行的长度 |
1 |
|
输入示例:逐行读取文件数据
循环读取文件每一行数据
1 |
|
输入示例:读取终端输入数据的行数