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

🍓 简介:java系列技术分享(👉持续更新中...🔥)

🍓 初衷:一起学习、一起进步、坚持不懈

🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏

🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

上一篇:Linux Shell编程入门到实战(四)

一、 Shell函数

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

1. 系统函数

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

1.1 basename系统函数

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

语法

shell 复制代码
basename [string / pathname] [suffix]  

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

演示

1.2 dirname系统函数

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

语法

shell 复制代码
dirname 文件绝对路径

演示

2. 自定义函数

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

语法

shell 复制代码
# 函数的定义
[ function ] funname ()
{
    命令
    [return 返回值]

}

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

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

注意

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

2.1 无参无返回值函数

文件脚本代码

shell 复制代码
#!/bin/bash
demo()
{
    echo "执行了函数"
}

# 调用函数
demo

运行效果

2.2 无参有返回值函数

fun2.sh文件脚本代码

shell 复制代码
#!/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文件脚本代码

shell 复制代码
#!/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脚本文件代码

shell 复制代码
#!/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

shell 复制代码
touch redirect1.txt

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

shell 复制代码
echo "zhanssan" >> redirect1.txt

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

预览错误消息

shell 复制代码
ls java

没有java目录所以报错

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

shell 复制代码
ls java 2> redirect2.txt

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

> 覆盖方式输出

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

运行效果

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

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

shell 复制代码
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命令语法

shell 复制代码
wc  [options]  [文件名]

options有如下:

选项 含义
-c character, 统计字节数
-w word, 统计单词数
-l line, 统计行数

演示

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

shell 复制代码
wc -l < redirect2.txt

运行效果

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

循环读取文件每一行数据

shell 复制代码
while read str; do echo $str; done < redirect2.txt

运行效果

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

相关推荐
AAA修煤气灶刘哥1 小时前
ES 聚合爽到飞起!从分桶到 Java 实操,再也不用翻烂文档
后端·elasticsearch·面试
爱读源码的大都督1 小时前
Java已死?别慌,看我如何用Java手写一个Qwen Code Agent,拯救Java
java·人工智能·后端
禁默1 小时前
Linux 之从硬件硬盘到文件系统的全面过渡
linux·运维·服务器
星辰大海的精灵2 小时前
SpringBoot与Quartz整合,实现订单自动取消功能
java·后端·算法
塵觴葉2 小时前
Linux内核网络的连接跟踪conntrack简单分析
linux·网络·conntrack
天天摸鱼的java工程师2 小时前
RestTemplate 如何优化连接池?—— 八年 Java 开发的踩坑与优化指南
java·后端
m0_464608262 小时前
监控 Linux 服务器资源
linux
一乐小哥2 小时前
一口气同步10年豆瓣记录———豆瓣书影音同步 Notion分享 🚀
后端·python
tongsound2 小时前
ros2 lifcycle介绍
linux·c++
LSTM972 小时前
如何使用C#实现Excel和CSV互转:基于Spire.XLS for .NET的专业指南
后端