Loading... <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://www.xn2001.com/archives/588.html" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://cdn.xn2001.com/img/2020/20200924184152.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">Shell基础入门</p> <div class="inster-summary text-muted"> linux系统是如何操作计算机硬件CPU,内存,磁盘,显示器等?使用linux的内核操作计算机的硬件Shell介绍... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://www.xn2001.com/archives/589.html" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://cdn.xn2001.com/img/2020/20200924221353.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">Shell计算命令</p> <div class="inster-summary text-muted"> Shell计算命令:expr命令详解介绍expr (evaluate expressions 的缩写),译为“表达... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://www.xn2001.com/archives/590.html" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://cdn.xn2001.com/img/2020/20200925002749.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">Shell流程控制</p> <div class="inster-summary text-muted"> 流程控制:if else语句if语法多行写法语法if 条件 then 命令 fi可以将if语句放入一行语... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://www.xn2001.com/archives/591.html" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://cdn.xn2001.com/img/2020/20200925133519.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">Shell函数定义</p> <div class="inster-summary text-muted"> Shell函数:系统函数函数介绍Shell编程和其他编程语言一样, 有函数, 函数是由若干条shell命令组成的... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://www.xn2001.com/archives/592.html" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://cdn.xn2001.com/img/2020/20200925144442.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">Shell实用工具</p> <div class="inster-summary text-muted"> Shell好用的工具: cut使用cut可以切割提取指定列字符字节的数据介绍cut 译为“剪切, 切割”,是一个... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://www.xn2001.com/archives/593.html" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://cdn.xn2001.com/img/2020/20200927231535.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">Shell常见的面试题</p> <div class="inster-summary text-muted"> 面试题:查空行问题:使用Linux命令查询 file1.txt 中空行所在的行号file1.txt数据准备xn20... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> # Shell函数:系统函数 **函数介绍** Shell编程和其他编程语言一样, 有函数, 函数是由若干条shell命令组成的语句块,实现Shell脚本代码重用和模块化编程。 **函数分类** 1.系统函数 2.自定义函数 **系统函数介绍** 系统自带提供的函数, 可以直接使用。 ## basename系统函数 ### 介绍 basename函数用于获取文件名的函数, 根据给出的文件路径截取出文件名 ### 语法 ```bash basename [string / pathname] [suffix] ``` > 根据根据指定字符串或路径名进行截取文件名, 比如: 根据路径"/one/two/aa.txt", 可以截取出aa.txt > > suffix:用于截取的时候去掉指定的后缀名。 ### 演示  ## dirname系统函数 ### 介绍 从指定的文件绝对路径, 去除文件名,返回剩下的前缀目录路径 ### 语法 ```bash dirname 文件绝对路径 ``` ### 演示  ## 小结 1. 函数的分类 > 系统函数 > > 自定义函数 2. 常用的系统函数 > basename 用于从指定路径中获取文件名 > > dirname 用于从指定的路径中获取目录名, 去掉文件名 # Shell函数:自定义函数 **介绍** 开发人员可以通过自定义开发函数,实现代码重用. **语法** ```bash # 函数的定义 [ function ] funname () { 命令 [return 返回值] } # 调用函数 funname 传递参数1 传递参数2 ... ``` > 1. 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。 > > 2. 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0~255) **必须在调用函数地方之前,先声明函数,shell脚本是逐行运行的, 只要先运行了函数,后面才可以时使用函数。** ## 示例:无参无返回值函数 文件脚本代码 ```bash #!/bin/bash demo() { echo "执行了函数" } # 调用函数 demo ``` 运行效果  ## 示例:无参有返回值函数 fun2.sh文件脚本代码 ```bash #!/bin/bash sum() { echo "求两个数的和..." read -p "输入第一个数字: " n1 read -p "输入第二个数字: " n2 echo "两个数字分别为 $n1 和 $n2 " return $(($n1+$n2)) } # 调用函数 sum echo "两个数字的和为: $? " # 获取函数返回值 ``` 运行效果  ## 示例:有参函数 ### 介绍 在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 `$n` 的形式来获取参数的值,例如,`$1` 表示第一个参数,`$2` 表示第二个参数 … 其他参数介绍 | 参数处理 | 说明 | | :------- | :----------------------------------------------------------- | | $# | 传递到脚本或函数的参数个数 | | $* | 以一个单字符串显示所有向脚本传递的参数 | | $$ | 脚本运行的当前进程ID号 | | $! | 后台运行的最后一个进程的ID号 | | $@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 | | $? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 | ### 演示 fun3.sh文件脚本代码 ```bash #!/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 ``` 运行效果  ## Shell程序与函数的区别 ### 区别 函数和shell程序比较相似,区别在于: Shell程序(内置命令和外部脚本文件), 外部脚本文件是在子Shell中运行, 会开启独立的进程运行 Shell函数在当前Shell的进程中运行 ### 演示 fun4.sh脚本文件代码 ```bash #!/bin/bash demo(){ echo "函数中打印当前进程ID:$$" } echo "当前脚本文件(Shell程序)打印当前进程ID:$$" # 调用函数 demo ``` 运行效果  ## 小结 1. 使用Shell的自定义函数实现代码重用 ```bash 函数名(){ 命令 # 使用$n获取函数的参数 [return 返回值] } ``` 2. 说出Shell程序命令与函数的区别 > Shell程序命令: 运行命令时开启一个子进程运行命令 > > 函数: 在当前Shell环境中运行, 没有开启进程 # Shell重定向:输入输出 ## 重定向介绍 ### 标准输入介绍 从键盘读取用户输入的数据,然后再把数据拿到Shell程序中使用; ### 标准输出介绍 Shell程序产生的数据,这些数据一般都是呈现到显示器上供用户浏览查看; ### 默认输入输出文件 每个 Unix/Linux 命令运行时都会打开三个文件, 文件如下 | 文件名 | 类型 | 文件描述符(file description, fd) | 功能 | | ------ | ------------------------------------- | -------------------------------- | ------------------------ | | stdin | (standard input)<br>标准输入文件 | 0 | 获取键盘的输入数据 | | stdout | (standard output)<br/>标准输出文件 | 1 | 将正确数据输出到显示器上 | | stderr | (standard error)<br/>标准错误输出文件 | 2 | 将错误信息输出到显示器上 | > 每个文件都有一个唯一的 **文件描述符fd**, 后面会通过唯一 **文件描述符fd** 操作对应的信息 Shell程序操作输入输出时用到这3个文件 1. Shell程序默认会从stdin文件中读取输入数据 2. Shell程序默认会向stdout文件中输出正确数据 3. Shell程序默认会向stderr文件中输出错误信息 这3个文件用于临时传输数据使用 ### 重定向输入输出介绍 1. 标准输入是数据默认从键盘流向程序,如果改变了它的方向,数据就从其它地方流入,这就是输入重定向。 2. 标准输出是数据默认从程序流向显示器,如果改变了它的方向,数据就流向其它地方,这就是输出重定向。 > 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 之间的内容作为输入。<br>标记名tag可以任意 | > 在输出重定向中,`>`代表的是覆盖输出,`>>`代表的是追加输出。 > > fd是文件描述符: > > 0 通常是标准输入(STDIN), > > 1 是标准输出(STDOUT), > > 2 是标准错误输出(STDERR)。 > > fd> 或 fd>> 中间不可以有空格 ## 输出示例:正确信息重定向输出 创建文件redirect1.txt ```bash touch redirect1.txt ``` 执行who命令重定向输出到redirect1.txt文件中 ```bash echo "itheima" >> redirect1.txt ```  ## 输出示例:错误信息重定向输出 预览错误消息 ```bash ls java ```  没有java目录所以报错,将错误消息输出到error.log文件中 ```bash ls java 2> redirect2.txt ``` > 2 是标准错误输出(STDERR), 注意 > > `>` 覆盖方式输出 > > `2>` 注意fd与>符号之间不能有空格 运行效果  ## 输出示例:正确和错误信息同时输出 将正确信息与错误信息都保存到一个文件中 ```bash echo "itcast" > redirect2.txt 2>&1 ``` > 数字 1 代表正确输出的结果输出到文件中 > 数字 2 代表错误结果输出到文件中 > > `2>&1` 将正确和错误都输出到文件中. `2>&` 中间不能有空格, 写法有2种 > > 合并第一种写法: `2>& 1` > > 合并第二种写法: `2>&1` 运行效果  ## 输入示例:统计文件数据行数 ### wc命令介绍 Linux wc 命令可以用来对文本进行统计,包括单词个数、行数、字节数 ### wc命令语法 ```bash wc [options] [文件名] ``` options有如下: | 选项 | 含义 | | ---- | --------------------- | | `-c` | character, 统计字节数 | | `-w` | word, 统计单词数 | | `-l` | line, 统计行数 | ### 演示 统计文件redirect2.txt中数据行数 ```bash wc -l < redirect2.txt ``` 运行效果  ## 输入示例:逐行读取文件数据 循环读取文件每一行数据 ```bash while read str; do echo $str; done < redirect2.txt ``` 运行效果  ## 输入示例:读取终端输入数据的行数  ## 小结 1.Shell重定向的含义 > 改变标准数据流动的方向, > > a.可以将数据输出到文件中, 叫重定向输出 > > b.可以读取文件中的数据作为输入, 叫重定向输入 2.使用重定向输出数据到文件中保存 > 命令 > file > > 命令 >> file > > 命令 2 >> file > > 命令 > file 2&>1 3.使用重定向从文件中读取输入数据 > 命令 < file > > 命令 < file1 > file2<hr class="content-copyright" style="margin-top:50px" /><blockquote class="content-copyright" style="font-style:normal"><p class="content-copyright">版权属于:乐心湖's Blog</p><p class="content-copyright">本文链接:<a class="content-copyright" href="https://www.xn2001.com/archives/591.html">https://www.xn2001.com/archives/591.html</a></p><p class="content-copyright">声明:博客所有文章除特别声明外,均采用 <a href="https://creativecommons.org/licenses/by-sa/4.0/deed.zh" target="_blank" rel="nofollow noopener noopener" one-link-mark="yes">CC BY-SA 4.0 协议</a> ,转载请注明出处!</p></blockquote> 腾讯云社区邀请各位技术博主加入,福利多多噢! Last modification:September 30th, 2020 at 02:01 am © 允许规范转载 Support 如果觉得我的文章对你有用,请随意赞赏 ×Close Appreciate the author Sweeping payments Pay by AliPay Pay by WeChat