shell的编程规范and重定向与管道操作

一、什么是shell

Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户。这种对话方式可是交互也可以是非交互式的,我们所输入的命令计算机是不识别的,这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们。

1、shell的作用

Linux系统中的shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个"命令解释器"的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
常见的shell 解释器程序有很多种,使用不同的Shell时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/ shells 文件可以了解当前系统所支持的 shell脚本种类。

二、shell编程规范

在vim编辑器中写入的Linux命令是按顺序依次执行的

shell脚本能干什么

在需要完成大量复杂、重复性的工作时,不需要在命令行重复执行命令,直接运行shell脚本即可,大大的节省了时间提高了效率

1、创建 shell 程序的步骤:

第一步:创建一个包含命令和控制结构的文件。
**第二步:修改这个文件的权限使它可以执行 **
第三步:检测语法错误
第四步:执行 ./

2、shell脚本的构成

  • 第一行为“#!/bin/bash”,脚本申明(默认解释器):表示此行以下的代码语句是通过/bin/bash程序来执行。

  • 还有其他类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect

  • 注释信息:以“#”开头的语句表示为注释信息,被注释的语句在脚本运行时不会被执行
    可执行语句:如echo命令,用于输出“ ”之间的字符串

编写脚本

[root@home ~]# vim first.sh 
[root@home ~]# chmod +x first.sh
[root@home ~]# ./first.sh 
当前的位置在
/etc/sysconfig
[root@home ~]# cat first.sh 
#!/bin/bash
cd /etc/sysconfig/
echo "当前的位置在"
pwd

3、shell脚本执行

shell 脚本的执行通常有以下几种方式

方法一:当前路径(绝对路径与相对路径)下执行脚本(要有执行权限)
/home/first.sh 或者 ./first.sh

方法二:sh 、bash脚本文件路径(这种方式可以不对脚本文件添加执行权限)
bash first.sh 或 sh first.sh

方法三:source 脚本文件路径(可以没有执行权限)
source first.sh

方法四:其他方法
sh < first.sh 或者 cat first.sh |sh(bash)
sh first.sh cat first.sh | sh cat first.sh | bash

三、重定向与管道操作

重定向符号:“>”、“>>”

用户通过操作系统处理信息的过程中,包括以下几类交互设备文件

编号名称默认的设备含义
0标准输入(STDIN)键盘命令将从标准输入文件中读取在执行过程中需要的输入数据
1标准输出(STDOUT)显示器命令将执行后的输出结果发送到标准输出文件
2标准错误(STDERR)显示器命令将执行期间的各种错误信息发送到标准错误文件。从键盘接收用户输入的各种命令字串、辅助控制信息,并将命令结果输出到屏幕上;如果命令执行出错,也会将错误信息反馈到屏幕上

1.重定向输出

重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。
重定向输出使用“>”或“>>”操作符号,分别用于覆盖或追加文件
若重定向输出的目标文件不存在,则会新建该文件,然后将前面命令的输出结果保存到该文件中;若目标文件已经存在,则将输出结果覆盖或追加到文件中。

  • “>” :意思是当原来文件中有内容的话,原来的内容会被覆盖掉

  • “>>” : 意思是当原来文件中有内容的话,新加的内容会追加到里面而不会覆盖原来的内容

举例:uname -p 输出处理器类型

uname -p > kernel.txt

#查看结果
cat kernel.txt
uname -r >> kernel.txt 

#查看结果
cat kernel.txt

命令 + 选项 + 参数 = 只是呈现一个结果集 stdout stderr

2.重定向输入

  • 重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待 从键盘输入。

  • 重定向输入使用“<”操作符。

  • 通过重定向输入可以使一些交互式操作过程能够通过读取文件来完成。

    • 例如,使用 passwd 命令为用户设置密码时,每次都必须根据提示输入两次密码字串,非常烦琐,若改 用重定向输入将可以省略交互式的过程,而自动完成密码设置(结合 passwd 命令的“–stdin” 选项来识别标准输入)。

举例

[root@localhost ~]# cat 1.txt   //以键盘为输入设备,这也是系统默认的
1234
1234
[root@localhost ~]# cat <1.txt   //跟cat 1.txt 结果是一样的,但是这是以1.txt文件作为输入设备了
1234
1234

默认情况下,cat 命令会接受标准输入设备(键盘)的输入,并显示到控制台,但如果用文件代替键盘作为输入设备,那么该命令会以指定的文件作为输入设备,并将文件中的内容读取并显示到控制台

3.错误重定向

错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指 定的文件,而不是直接显示在屏幕上。

错误重定向使用“2>”操作符

2个作用:

  1. 在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据
  2. 还可以将无关紧要的错误信息重定向到空文件/dev/null 中,以保持脚本输出的简洁
  • 使用“2>”操作符时,会像使用“>”操作符一样覆盖目标文件的内容,若要追加内容而不是覆盖文件,则应改用“2>>”操作符 # “2” = 标准错误(STDERR)

  • 当命令输出的结果可能既包括标准输出(正常执行)信息,又包括错误输出信息时,可 以使用操作符“>”“2>”将两类输出信息分别保存到不同的文件,也可以使用“&>”操作符将两类 输出信息保存到同一个文件

  • /dev/null:把它看作"黑洞",所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然 而 /dev/null 对命令行和脚本都非常的有用

    echo kgc > /dev/null
    cat /dev/null #什么信息也看不到
    #做为清空
    cat /dev/null > file_name
    

4.混合符号

&>和>&
&表示混合的意思
举例:把正确和错误的消息输入到相同的位置
1>&2 把标准输出重定向到标准错误
2>&1 把标准错误重定向到标准输出

ls /tmp xxxx >1.txt 2>&1
或:
ls /tmp xxxx 2>2.txt 1>&2

将错误显示的内容和正确显示的内容分开

ls /etc/passwd  xxxx
ls: 无法访问 xxx: 没有那个文件或目录
/etc/passwd
ls /etc/passwd xxx > a.txt
ls: 无法访问 xxx: 没有那个文件或目录
cat a.txt 
/etc/passwd
ls /etc/passwd xxx 2> a.txt
/etc/passwd
cat a.txt 
ls: 无法访问 xxx: 没有那个文件或目录

注:使用 2> 操作符时,会像使用 > 一样覆盖目标文件的内容,若追加而不覆盖文件的内容即可使用 2>> 操作符

5.管道操作

  • 管道(pipe)操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。

  • 在 Shell 脚本应用中,管道操作通常用来过滤所需要的关键信息。

  • #!/bin/bash

    • $bash 表 示 系 统 提 示 符 , 表示系统提示符, 表示此用户为普通用户,超级用户的提示符是#
    • bash是shell的一种,是linux下最常用的一种shell
    • $bash的意思是执行一个子shell,此子shell为bash。

举个栗子:查看用户自己系统可以使用的shell种类

##过滤出用户和sell种类
[root@home ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
wang /bin/bash
##过滤出用户
[root@home ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1}'
root
wang
[root@home ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $7}'
/bin/bash
/bin/bash
[root@home ~]# grep "/bin/bash$" /etc/passwd 
root:x:0:0:root:/root:/bin/bash
wang:x:1001:1001::/home/wang:/bin/bash
$1 :$2:$3  :$4  :$5:  $6        :$7       ##以冒号为分隔  
  • 主要使用grep过滤出想要显示的那一行,然后使用awk打印需求

awk语法由一系列条件和动作组成,在花括号内可以有多个动作,多个动作之间用分号分隔,在多个条件和动作之间可以有若干空格,也可以没有。

  • 如果没有指定条件则匹配所有数据,如果没有指定动作则默认为print打印。

  • 默认以空格、换行符、制表符作为分隔符,使用-F可以指定分隔符

awk -F: '{print $1}' /etc/passwd		#以冒号作为分隔符
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值