- 定义:
- 命令语言解释器,翻译命令给内核,内核转交给CPU执行
- 用户/内核间的接口程序
- 无论GUI/CLI,一切输入先由shell解释再传给内核
- bash shell
shell的版本有sh、bash、csh、ksh等
其中bash是Linux世界使用最广泛的shell,也是很多Linux发行版的默认shell
- 获取当前系统可用shell
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
- 查看当前使用的shell
[root@localhost ~]# echo $SHELL
/bin/bash
5.CLI:
Command Line Interface(命令行接口)
GUI:
Graphical User Interface(图形用户接口)
标准输入
缺省是终端键盘,所谓缺省,即系统默认状态
标准输出
缺省是终端屏幕,至于终端这个概念,你就简单理解为显示器加键盘吧
标准错误输出
缺省是终端屏幕
执行一条shell命令,就会打开这三个文件,可以理解为三条管道,
标准输入与键盘相连,
标准输出和标准错误输出都默认与屏幕相连
没有特别指明的情况下,我们通过键盘输入的内容通过“标准输入”这条管道“流入”至相应的命令,命令的执行结果又会通过“标准输出”或“标准错误输出”这条管道“流出”至屏幕,展现在我们面前
# 将"hello"添加到test.txt这个文件中,如果不存在就创建
[root@localhost ~]# echo "hello" > test.txt
# 输出test.txt文件内容
[root@localhost ~]# cat test.txt
hello #标准输出
- 重定向
比如一条命令cat test.txt,它会把test.txt这个文件的内容输出到屏幕上,但我不想输出到屏幕上,我想保存到一个文件里,就可以用”标准输出重定向“符号>将其重定向到某个文件cat test.txt > temp.txt,这样屏幕上就没有输出,也就改变了标准输出的流出方向,故而称之为”重定向“
1 >又称为”覆盖重定向“,就是说会覆盖输出文件原先的内容List item
2 >>被称为”追加重定向“,也就是说不会覆盖输出文件的内容,而是把输出追加到原内容的后面
3 <被称为”标准输入重定向“,一般命令的标准输入都是键盘,用了<,其标准输入就变成其后的文件了。比如,cat本身就能够以文件作为其标准输入,但我们也可以利用<来将文件变成其标准输入:cat < test.txt
4 前面又说了,所谓的标准输入、标准输出以及标准错误输出其实都是文件,是文件就会有文件描述符,就像人的名字一样,不然内核哪知道哪个文件是哪个文件啊。
5 标准输入的文件描述符是0,标准输出是1,标准错误输出是2。所以,如果我们想把cat test.txt的标准输出重定向到stdout.txt,其标准错误输出重定向到stderr.txt,可以这样做:cat test.txt 1> stdout.txt 2> stderr.txt,0和1一般都可以省略。
6 如何把标准错误输出与标准输出重定向到同一个文件?还是上面的例子:cat test.txt > temp.txt 2>&1。还有一种方式是不区分标准错误输出与标准输出,统统重定向到同一个文件:cat test.txt &> temp.txt - 什么是管道
例子:
[root@localhost ~]# echo “zhangsan” | useradd
# 这条命令的意思是输出”zhangsan“,并利用useradd命令添加其为linux普通用户
# ”zhangsan“为管道前的标准输出,管道将其变成后面useradd命令的标准输入
管道只能处理前一个命令的标准输出,标准错误输出无法处理
管道后面的命令必须能够接受标准输入才行,像ls命令就不接受标准输入,所以它不能放在管道后面。
ls命令的作用是列举目录下的内容,当然了,在linux世界怎么能接受不能呢,利用xargs就可以把管道前的标准输出当作ls命令的标准输入了
[root@localhost ~]# echo "/etc"| xargs ls
# 没有xargs的话,这里的ls只能列举当前目录的内容,而非/etc这个目录
- 什么是shell脚本?
shell是一个命令语言解释器。
shell本身也是一个程序,有自己的命令,像什么ls、cd、pwd等都是其内置命令,还有一些其他命令,都是别人为linux添加的基本命令。
我们知道,编程时通过各种库调用来实现功能,而shell没有库,他通过调用各种命令来实现相应功能。
我们通过输入各种命令与shell交互,但有时我们不想手动输入各种命令,我们想把命令存在一个文件中,然后让shell执行该文件中的命令,于是就有了shell脚本。
所谓的shell脚本其实就是一个包含一系列shell命令的文本,目的是减少重复工作,实现自动化。 - shell脚本基本组件
shell脚本是由各种shell命令组成,但绝对不是简单的命令堆积,它像其他编程语言一样,有自己的基本组件。
- shell命令
- shell内部命令,如ls、cd、pwd等
- 其他命令
- who、du、free等各种丰富的功能命令
- 数据结构
- 变量、数组、字典
- 函数
-将一系列命令组合成一个函数,减少重复工作 - 控制流
- if、case等分支语句
for、while等循环语句
- if、case等分支语句
- 如何快速编写一个脚本?
三部分组成:脚本声明,注释,可执行语句
- 脚本声明
CPU只能执行二进制文件
脚本是文本文件,需要shell解释,shell本身是二进制文件
CPU运行shell程序,shell解释脚本的每一行内容,然后找到对应的二进制程序,由CPU执行
首先我们得告诉CPU,该脚本用哪个解释器来解释
声明:在脚本第一行顶格写:#!/bin/bash
#!被称为shebang符号,用来声明所使用的解释器,一旦执行某个脚本,CPU看到第一行,就会去执行该解释器,再由解释器去找对应的命令程序
/bin/bash指明bash二进制程序的位置
- 注释
解释器会忽略注释
- 可执行语句
linux命令以及相应的控制流与数据结构
条件判断,shell if语法或shell case语法
需要重复执行某命令,就搜shell for循环或shell while循环
- 一个批量ping ip脚本
先说一个命令,检测网络通不通,需要用到ping命令,我们想批量检测某一个网段的主机是否网络通畅,那就需要用到for循环
#linux中默认编辑器通常是vi或vim,该文本编辑器分为三种模式
#默认是普通模式(无法输入内容,但可以通过相应命令操作文本),普通模式下按i表示进入插入模式(可以插入内容了)
#按:表示进入命令行模式(批量操作文本),在插入模式或命令行模式下按ESC进入普通模式。输入ZZ或:wq退出vim编辑器
[root@localhost ~]# vim ping.sh
#默认进入普通模式,先按i开始编写脚本,下面是脚本完整内容
#!/bin/bash
NET=192.168.1 #声明一个变量并赋值
for i in {1..254} #后面的{1..254}表示循环范围从1-254,如果你就是想测试下,这里就改成{1..10}吧
do
IP=$NET.$i #字符拼接并赋值给IP这个变量
ping -c 3 $IP &> /dev/null
#-c指明发包次数,&> /dev/null表示无论正确输出还是错误输出统统丢弃
#$?表示上条命令的执行结果,0表示成功,非0表示失败
#-eq代表”是否等于“,[]是条件测试语法,测试条件左右必须各留至少一个空格
if [ $? -eq 0 ];then
echo "$IP is up"
else
echo "$IP is down"
fi
done
# 编写完毕,按ECS进入普通模式,然后输入:wq退出vim编辑器
- 执行脚本主要有三种方法:
- 直接运行脚本文件
- 这种方法需要脚本有可执行权限:chmod u+x ping.sh
- 然后输入脚本的绝对路径或相对路径来执行文件
- 比如相对路径,你得先进入脚本所在的目录,然后执行:./ping.sh
- 利用解释器执行
- 利用source或.
# 假如你想把执行结果保存到一个文件,也就会利用输出重定向
# 但同时你又想输出其结果到屏幕上,那就会用到tee命令了
[root@localhost ~]# bash ping.sh | tee out.txt
192.168.1.1 is up
192.168.1.2 is down
...
#现在你想知道有多少个ip是通的,这就用到涉及文本过滤命令grep以及统计命令wc
[root@localhost ~]# grep "up" out.txt | wc -l
3