Linux Shell编程入门到实战(五)

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

上篇请阅读:Linux Shell编程入门到实战(四)

在这里插入图片描述

一、 Shell函数

Shell编程和其他编程语言一样, 有函数, 函数是由若干条shell命令组成的语句块,实现Shell脚本代码重用和模块化编程。

1. 系统函数

系统自带提供的函数, 可以直接使用.

1.1 basename系统函数

basename函数用于获取文件名的函数, 根据给出的文件路径截取出文件名

语法

basename [string / pathname] [suffix]  

根据根据指定字符串或路径名进行截取文件名, 比如: 根据路径"/one/two/aa.txt", 可以截取出aa.txt
suffix: 用于截取的时候去掉指定的后缀名.

演示
在这里插入图片描述

1.2 dirname系统函数

从指定的文件绝对路径, 去除文件名,返回剩下的前缀目录路径

语法

dirname 文件绝对路径

演示

在这里插入图片描述

2. 自定义函数

自定义开发函数,实现代码重用.

语法

# 函数的定义
[ function ] funname ()
{
    命令
    [return 返回值]

}

# 调用函数
funname 传递参数1 传递参数2 ...
  1. 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。

  2. 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0~255)

注意

必须在调用函数地方之前,先声明函数,shell脚本是逐行运行, 只要先运行了函数, 后面才可以时使用函数

2.1 无参无返回值函数

文件脚本代码

#!/bin/bash
demo()
{
    echo "执行了函数"
}

# 调用函数
demo

运行效果
在这里插入图片描述

2.2 无参有返回值函数

fun2.sh文件脚本代码

#!/bin/bash
sum()
{
    echo "求两个数的和..."
    read -p "输入第一个数字: " n1
    read -p "输入第二个数字: " n2
    echo "两个数字分别为 $n1$n2 "
    return $(($n1+$n2))
}

# 调用函数
sum
echo "两个数字的和为: $? "  # 获取函数返回值

运行效果
在这里插入图片描述

2.3 有参函数

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

其他参数介绍

参数处理说明
$#传递到脚本或函数的参数个数
$*以一个单字符串显示所有向脚本传递的参数
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

演示

fun3.sh文件脚本代码

#!/bin/bash
funParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
# 调用函数
funParam 1 2 3 4 5 6 7 8 9 10 22

运行效果

在这里插入图片描述

3. Shell程序与函数的区别

区别

  • Shell 程序(内置命令和外部脚本文件), 外部脚本文件是在子Shell中运行, 会开启独立的进程运行

  • Shell函数在当前Shell的进程中运行

演示

fun4.sh脚本文件代码

#!/bin/bash
demo(){
        echo "函数中打印当前进程ID:$$"
}

echo "当前脚本文件(Shell程序)打印当前进程ID:$$"
# 调用函数
demo

运行效果

在这里插入图片描述

二、 Shell重定向输入输出

1. 重定向介绍

标准输入介绍

从键盘读取用户输入的数据,然后再把数据拿到Shell程序中使用;

标准输出介绍

Shell程序产生的数据,这些数据一般都是呈现到显示器上供用户浏览查看;

默认输入输出文件

每个 Unix/Linux 命令运行时都会打开三个文件, 文件如下

文件名类型文件描述符(file description, fd)功能
stdin(standard input)
标准输入文件
0 获取键盘的输入数据
stdout(standard output)
标准输出文件
1 将正确数据输出到显示器上
stderr(standard error)
标准错误输出文件
2 将错误信息输出到显示器上

每个文件都有一个唯一的 文件描述符fd, 后面会通过唯一 文件描述符fd 操作对应的信息

Shell程序操作输入输出时用到这3个文件

  1. Shell程序默认会从stdin文件中读取输入数据
  2. Shell程序默认会向stdout文件输出正确数据
  3. Shell程序默认会项stderr文件中输出错误信息

这3个文件用于临时传输数据使用

重定向输入输出介绍

  1. 标准输入是数据默认从键盘流向程序,如果改变了它的方向,数据就从其它地方流入,这就是输入重定向。

  2. 标准输出是数据默认从程序流向显示器,如果改变了它的方向,数据就流向其它地方,这就是输出重定向。

    Linux Shell 重定向分为两种,一种输入重定向,一种是输出重定向;

2. 重定向的作用

输出重定向是指命令的结果不再输出到显示器上,而是输出到其它地方,一般是文件中。这样做的最大好处就是把命令的结果保存起来,当我们需要的时候可以随时查询。

2.1 重定向语法

命令说明
命令 > 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>> 中间不可以有空格

2.2 输出示例:正确信息重定向输出

创建文件redirect1.txt

touch redirect1.txt

执行who命令重定向输出到redirect1.txt文件中

echo "zhanssan" >> redirect1.txt

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AAsBEUwU-1682299070359)(assets/image-20200705211524230.png)]

2.3 输出示例:错误信息重定向输出

预览错误消息

ls java

没有java目录所以报错

将错误消息输出到redirect2.log文件中

ls java 2> redirect2.txt

2 是标准错误输出(STDERR), 注意

> 覆盖方式输出

2> 注意fd与>符号之间不能有空格

运行效果

在这里插入图片描述

2.4 输出示例:正确和错误信息同时输出

将正确信息与错误信息都保存到一个文件中

echo "haha" > redirect2.txt 2>&1

数字 1 代表正确输出的结果输出到文件中
数字 2 代表错误结果输出到文件中

2>& 1 将正确和错误都输出到文件中. 2>& 中间不能有空格, 写法有2种

​ 合并第一种写法: 2>& 1

​ 合并第二种写法: 2>&1

运行效果

在这里插入图片描述

2.5 输入示例:统计文件数据行数

2.5.1 wc命令介绍

Linux wc 命令可以用来对文本进行统计,包括单词个数、行数、字节数

wc命令语法

wc  [options]  [文件名]

options有如下:

选项含义
-ccharacter, 统计字节数
-wword, 统计单词数
-lline, 统计行数

演示

统计文件redirect2.txt中数据行数

wc -l < redirect2.txt

运行效果

在这里插入图片描述

2.6 输入示例:逐行读取文件数据

循环读取文件每一行数据

while read str; do echo $str; done < redirect2.txt

运行效果

在这里插入图片描述

2.7 输入示例:读取终端输入数据的行数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GO9vXvVG-1682299070362)(assets/image-20200705231347332.png)]第六篇请阅读:Linux Shell编程入门到实战(六)
在这里插入图片描述在这里插入图片描述

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dream_sky分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值