Shell脚本的学习心得和知识总结(一)| 基础知识简介和常用命令

2020年2月15日21:38:30


首先介绍一下学习背景:
Ubuntu+Xshell or Centos+Xshell
在这里插入图片描述

sudo apt-get install openssh-server //安装ssh
ps -e |grep ssh//查看进程

在这里插入图片描述

shell简介

什么是脚本?
脚本常见的就是:一条条文件命令(一些指令的堆积),这些文字命令是可以看到的(如使用记事本打开、查看、编辑的)。
常见的脚本:JS(前端)、ASP、JSP、PHP(后端)、SOL、Perl、Shell、Python、Ruby、Lua等

Shell脚本的特点:简单、易学、好用、高效、短小精悍 它的特点如下:

  • 属于内置的脚本
  • 程序开发的效率非常高,依赖于功能强大的命令可以迅速的完成开发任务(批处理)
  • 语法简单 学起来比较轻松,简单易学 好用高效

注:运维人员需要掌握的必需语言,给大家说一下:我是做pg内核开发的,学习shell是兴趣所致,我不是运维。
什么是shell?
shell是一个C语言编写的脚本语言,它是用户与Linux的桥梁。用户输入命令交给shell处理,shell将相应的操作传递给内核(Kernel),然后内核把处理的结果输出给用户。流程示意图如下:
在这里插入图片描述
如上图所示:shell是工作在Linux的内核之上 ,而Linux是开源、免费的类Unix OS,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的OS。在1983年9月27日的GNU计划,其目标在于:创建一套完全自由的OS。为保证GNU软件可以自由的使用、复制、修改和发布,所有的GNU软件都有一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议:即GNU General Public License.也就是说:不可以作为商业用途。

GNU即:GNU is Not Unix的缩写,其中的Unix是广泛使用的商业OS的名称。
1985年开始,新创建的Free Software Foundation来为GNU计划提供技术、法律以及财政上的支持。GNU计划开发主要的项目有:Emacs、GCC(GNU Compller Collection,GNU编译器集合)、Bash等,GCC是一套GNU开发的编程语言编译器。还有开发一些Unix系统的程序库和工具。

1991年,Linux之父开发出了与Unix兼容的Linux OS内核,并在GPL条款下发布。
1992年,Linux与其他GNU软件结合,完全自由的GNU/Linux OS正式诞生,简称Linux。
1995年,Bob 创建ACC公司,以GNU/Linux为核心,开发出RedHat Linux商业版。

Linux的基本思想:一切皆文件;每个软件都有确定的用途。

shell分类

基本上shell分两大类:

一、图形界面shell(Graphical User Interface shell 即 GUI shell)

例如:应用最为广泛的 Windows Explorer (微软的windows系列操作系统),还有也包括广为人知的 Linux shell,其中linux shell 包括 X window manager (BlackBox和FluxBox),以及功能更强大的CDE、GNOME、KDE、 XFCE。GUI 为Unix或者类Unix OS构造一个功能完善、操作简单以及界面友好的桌面环境。

二、命令行式shell(Command Line Interface shell ,即CLI shell)

CLI是在用户提示符下键入可执行指令的界面,用户通过键盘输入指令,完成一系列的操作。在Linux OS主流的CLI实现是Bash,是许多Linux发行版默认的Shell。还有许多Unix上的Shell,例如csh、ash、bsh等。

因为Shell是一个程序,一般都是放在/bin或者/user/bin目录下面。当前Linux OS的可用的Shell都是放在/etc/shells文件(纯文本文件)中,下面就跟着我看一下系统的Shell:
在这里插入图片描述
查看当前Linux的默认Shell,如下:

song@song-virtual-machine:~$ echo $SHELL //输出SHELL环境变量
/bin/bash
//上面的SHELL是Linux OS的环境变量,指向了当前使用的shell程序的位置,也即:使用哪个shell

第一个shell脚本并执行

首先先写一个hello world,如下:
在这里插入图片描述

song@song-virtual-machine:~/song_shell_dir$ ll hello_world.sh 
-rw-rw-r-- 1 song song 74 215 23:25 hello_world.sh
//上面这个文件没有执行权限,不能执行

因此加上执行权限如下:
在这里插入图片描述
这种方式默认根据脚本第一行指定的解释器处理,如果没写以当前默认 Shell 解释器执行。

注:这里在运行时一定要写成 ./hello_world.sh(绝对路径亦可),而不是 hello_world.sh,运行其他二进制的程序也一样,直接写 hello_world.sh,Linux 系统会去 PATH(环境变量) 里寻找有没有叫 hello_world.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 hello_world.sh 是会找不到命令的,要用 ./hello_world.sh 告诉系统说,就在当前目录找。所以上面是./,在当前目录下执行这个脚本文件。不使用./的话,也是可以的,如下:
在这里插入图片描述
新建的文件的内容如下:

export PATH=/home/song/song_shell_dir:$PATH //以:分割

source就是为了重新加载配置文件(让我们写的那个配置文件生效)。
看一下前后的PATH对比,如下:

song@song-virtual-machine:~/song_shell_dir$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

song@song-virtual-machine:~/song_shell_dir$ echo $PATH
/home/song/song_shell_dir:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

//上面的每个路径都是以:分割

下面再演示一下第三种执行方式:

song@song-virtual-machine:~/song_shell_dir$ ls
hello_world.sh
song@song-virtual-machine:~/song_shell_dir$ chmod -x hello_world.sh 
song@song-virtual-machine:~/song_shell_dir$ ls
hello_world.sh
song@song-virtual-machine:~/song_shell_dir$ bash hello_world.sh 
Hello songjinzhou //这里没有执行权限,依然可以执行。当前终端会新生成一个子bash 去执行脚本。

song@song-virtual-machine:~/song_shell_dir$ source hello_world.sh 
Hello songjinzhou     //使用source 也行,以当前默认 Shell 解释器执行

在这里插入图片描述
OK,下面就来小结一下上面的几种执行脚本的方式差异:
source filename 与 bash filename 及./filename 执行脚本的差异:

  • 当shell脚本具有可执行权限时,用bash filename与./filename执行脚本是没有区别的。./filename是因为当前目录没有在PATH中,所以”.”是用来表示当前目录的。在它里面来找到文件并执行
  • source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面
  • bash filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell。

OK,下面就来看一下子shell和父shell:(使用pstree)
第一个bash如下:
在这里插入图片描述
上面的 ,就会如下所示:

├─sshd─┬─sshd───sshd───bash───bash───pstree
│      └─sshd───sshd───bash

OK,子shell新建的、改变的变量不会被带回父shell:
在这里插入图片描述
下面是子shell继承父shell的环境变量 注意:环境变量
在这里插入图片描述
例题演示
使用root用户帐号创建并执行test2.sh,实现创建一个shelltest用户,并在其家目录中新建文件try.html
在这里插入图片描述
注:shell脚本是从上到下 依次执行的
统计当前系统总共有多少用户

cat /etc/passwd | wc -l

统计当前已经安装的软件数量

yum list installed 列举已安装
yum list available 列举未安装
yum list installed | wc -l

在这里插入图片描述

shell编程几个常用命令

grep命令

其作用如下:(其后面跟的都是正则表达式)

//过滤来自一个文件或标准输入匹配模式内容。
//除了 grep 外,还有 egrep。egrep 是 grep 的扩展,相当于 grep -E。

Usage: grep [OPTION]... PATTERN [FILE]...
grep常用选项详解
选项 功能
-E,–extended-regexp 模式是扩展正则表达式(ERE)
-i,–ignore-case 忽略大小写
-n,–line-number 打印行号 (所在文本的行号,即内容所处的行号)
-o,–only-matching 只打印匹配的内容
-c,–count 只打印每个文件匹配的行数
-B,–before-context=NUM 打印匹配的前几行
-A,–after-context=NUM 打印匹配的后几行
-C,–context=NUM 打印匹配的前后几行
- -color[=WHEN] 匹配的字体颜色
-v,–invert-match 打印不匹配的行

具体演示如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

grep "^$" test             # 若是要打印 test文件中的空行
grep -v "^$" test | wc -l  # 若是要统计 test文件中非空行的个数

cut命令

使用说明:
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

cut常用选项详解
cut [-bn] [file]
cut [-c]  [file]
cut [-df] [file]
--------------------
常用参数:

-c :以字符为单位进行分割。(character)切割指定的字符

-d :自定义分隔符。

-f :与-d一起使用,指定显示哪个区域。(被切割之后的 第几列)

在这里插入图片描述
一个小任务:为一些用户随机创建出来6位随机密码,如下:
在这里插入图片描述
把一个文件中里面的空行删掉,把其余内容导入到一个文件中。如下:
在这里插入图片描述
把test1文件里面的x都给列举出来:注:分隔符得是单个字符
在这里插入图片描述
在这里插入图片描述

sort命令

Linux sort命令用于将文本文件内容加以排序。sort可针对文本文件的内容,以行为单位 来排序。

sort常用选项详解
语法:
sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]
 
常用参数说明:
-k:根据切割后的那一段进行排序
-n 依照字符串数值的大小排序(默认是根据字符进行排序)。
-r 以相反的顺序来排序。(reverse)
-t<分隔字符> 指定排序时所用的栏位分隔字符。
-u:去除重复的行(只要那个指定的字段重复,就认定是重复的行)

在这里插入图片描述
注:sort 命令将以默认的方式将文本文件的第一列以ASCII 码的次序排列,并将结果输出到标准输出。
在这里插入图片描述
去除重复的行:
在这里插入图片描述

uniq命令

uniq常用选项详解
作用:
去除重复的行(相邻且相同,认定为重复)

选项:
-c:在行首用数字表示该行出现了多少次

-u:仅仅显示那些没有出现重复过的行

在这里插入图片描述

seq命令

seq常用选项详解
作用:
生成一个数组序列

格式:
seq [start  [step]] stop

在这里插入图片描述

[root@localhost myshell_study]# seq 4  #终止位4
1
2
3
4
[root@localhost myshell_study]# seq 4 6  #起始位4,终止位6
4
5
6
[root@localhost myshell_study]# seq 4 2 10   #起始位4,步长为2,终止位10
4
6
8
10
[root@localhost myshell_study]# seq 4 3 10   #起始位4,步长为3,终止位10
4
7
10
[root@localhost myshell_study]# seq 4 4 10
4
8

---------------------------------------------
# 10 以内的奇数:
[root@localhost myshell_study]# seq 1 2 10
1
3
5
7
9

tr命令

tr常用选项详解

Linux的 tr命令用于转换或删除文件中的字符。tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备。

a-z 任意小写

A-Z 任意大写

0-9 任意数字

# 替换大小写
[root@localhost myshell_study]# echo "I AM songjinzhou" | tr [A-Z] [a-z]
i am songjinzhou
[root@localhost myshell_study]# echo "I AM songjinzhou" | tr [a-z] [A-Z]
I AM SONGJINZHOU

# 删除特定字符串
[root@localhost myshell_study]# echo "I AM songjinzhou" | tr -d I
 AM songjinzhou
[root@localhost myshell_study]# echo "I AM songjinzhou" | tr -d i
I AM songjnzhou
[root@localhost myshell_study]# echo "I AM songjinzhou" | tr -d " "
IAMsongjinzhou
[root@localhost myshell_study]# echo "I AM songjinzhou" | tr -d "zh"
I AM songjinou

任务处理

任务一:获取主机IP地址,获取结果仅显示IP,例如:192.168.124.20 使用尽可能多的方法
背景如下:
在这里插入图片描述
第一种方法:

[root@localhost myshell_study]# ip a | grep "dynamic"
    inet 192.168.124.20/24 brd 192.168.124.255 scope global dynamic ens33
[root@localhost myshell_study]# ip a | grep "dynamic" | cut -d "/" -f 1
    inet 192.168.124.20
[root@localhost myshell_study]# ip a | grep "dynamic" | cut -d "/" -f 1 | tr -d " "
inet192.168.124.20
[root@localhost myshell_study]# ip a | grep "dynamic" | cut -d "/" -f 1 | tr -d " " | tr -d "inet"
192.168.124.20

第二种:

[root@localhost myshell_study]# ip a | grep "dynamic" | cut -d "/" -f 1 
    inet 192.168.124.20
[root@localhost myshell_study]# ip a | grep "dynamic" | cut -d "/" -f 1 | cut -d " " -f 6
192.168.124.20

第三种:

[root@localhost myshell_study]# ip a | grep "dynamic" 
    inet 192.168.124.20/24 brd 192.168.124.255 scope global dynamic ens33
[root@localhost myshell_study]# ip a | grep "dynamic" | cut -d "b" -f 1
    inet 192.168.124.20/24 
[root@localhost myshell_study]# ip a | grep "dynamic" | cut -d "b" -f 1 | tr -d [a-z]
     192.168.124.20/24 
[root@localhost myshell_study]# ip a | grep "dynamic" | cut -d "b" -f 1 | tr -d [a-z] | cut -d '/' -f 1
     192.168.124.20
[root@localhost myshell_study]# ip a | grep "dynamic" | cut -d "b" -f 1 | tr -d [a-z] | cut -d '/' -f 1 | tr -d ' '
192.168.124.20

第四种:

[root@localhost myshell_study]# ip a | grep dynamic | tr -d [a-z] 
     192.168.124.20/24  192.168.124.255    33
[root@localhost myshell_study]# ip a | grep dynamic | tr -d [a-z] | cut -d "/" -f 1
     192.168.124.20
[root@localhost myshell_study]# ip a | grep dynamic | tr -d [a-z] | cut -d "/" -f 1 | tr -d " "
192.168.124.20

任务二:有如下一个文件,文件内容如下。请把下方的内容复制到你的一个文件中,并完成如下需求。需求1. 统计出各个网址出现的次数;需求2. 按照出现次数排序(升序); 需求3. 取出出现次数排名前两名的网址
背景如下:

[root@ken ~]# cat ken.sh
http://www.baidu.com
http://www.baidu.com
http://www.sina.com
http://www.sina.com
http://www.sina.com
http://www.sina.com
http://www.sina.com
http://www.sina.com
http://www.sina.com
http://www.sina.com
http://www.sina.com
http://www.sina.com
http://www.sina.com
http://www.sina.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.qq.com
http://www.qq.com
http://www.qq.com
http://www.qq.com
http://www.qq.com
http://www.qq.com
http://www.qq.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.taobao.com
http://www.taobao.com
http://www.taobao.com
http://www.taobao.com
http://www.taobao.com
http://www.taobao.com
http://www.taobao.com
http://www.taobao.com
http://www.taobao.com
http://www.taobao.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com

需求1. 统计出各个网址出现的次数
需求2. 按照出现次数排序(升序)
需求3. 取出出现次数排名前两名的网址
在这里插入图片描述
2020年2月27日01:34:57

猜你喜欢

转载自blog.csdn.net/weixin_43949535/article/details/104335241
今日推荐