写在前面的话: 本人非专业运维人员,因业务需要曾做过一些 Shell 脚本的编写,但对 Shell 的理论的理解上还停留在很浅显的层面,由此导致的不严谨和错误还请各位多多批评和订正。

开胃菜(热热场)

image.png

适宜人群

略懂 Linux 基本操作命令或者零基础的同学,最好是零基础,因为我能教的也不多。。。




Shell 是什么?

image.png
大白话概括:Shell 脚本就是为了实现某种功能而进行的 Linux 命令的整合,是可以执行的程序。
公式:Shell脚本 = 命令1 + 命令2 + ... + 命令n

Shell 怎么用?

在开发界一直有一个不成文的规定,那就是无论学任何东西第一目标一定是输出”hello world”。毫不夸张地说,你离入门一个技能点有时真的就只差了一个”hello world”。

直接开门见山。

操作步骤:

  1. 使用 XShell 连接上 Linux 服务器(不会请自行百度)
  2. 创建一个 hello.sh,并在文件中输出echo "hello world" 保存,退出;
  3. 运行脚本 sh hello.sh,查看输出结果。

以上操作涉及的知识点:

  • 创建文件:vim 文件名 或者 touch 文件名
  • 退出操作文件:命令模式下输入:wq 保存并退出(快捷键”zz”),输入 :q! 不保存退出(快捷键”zq”)。
  • 运行脚本:sh 文件名

至此,以后大家都是掌握 Shell 基础的人了。

补充一些 Linux 指令

正如前面 Shell 脚本定义中所讲,Shell 脚本的本质是 Linux 命令,想掌握 Shell 脚本就必须先掌握一些更基础的 Linux 命令。

程序员经常自我调侃说自己就是一个搬砖的,主要指的是日常的主要工作都是”CRUD”(增删改查),事实上无论是工作还是生活无一不是由”CRUD”构成的。 Shell 脚本自然也免不了俗,也是如此。命令及其作用(换个眼熟即可)

  • rm:删除文件,删库跑路必备技能。eg.rm -rf hello.shrm -rf /*

  • echo:输出指令,日常脚本调试必备。 ```shell

    输出至控制台

    echo “hello world”

置空并输出至 cmd.log 文件

echo “hello moto” > cmd.log

追加至 cmd.log 文件

echo “hello 酷狗” >> cmd.log ```

  • tail、cat:查看程序日志信息必备。eg. tail -200f system.logcat /etc/my.cnf

**

  • grep:常和其他指令组合使用,eg. ps -ef | grep java、grep "1220CC" system.log

**

  • find:查找不知道位置的文件,eg. find / -name mysql

**

  • awk:对文本信息的一种处理、筛选并输出。eg. echo "特别能吃苦" | awk -F '苦' '{print $1}',对于”空格”,可以省略”-F”,即 echo "特别能吃苦才怪" | awk '{print $1,2}'

  • sed:根据指定规则逐行读取文件内容并进行CRUD操作。

  • 其他高频指令

    • ping、telnet:经常用于排查服务器网络、端口是否畅通。eg. ping www.baidu.comtelnet 10.35.83.235 8101
    • 启停 MySQL(8.0+、5.6+)
      • systemctl start mysqld、service mysql start
      • systemctl stop mysqld、service mysql stop
      • systemctl status mysqld、service mysql status
    • 运行 SpringBoot 项目

    nohup java -jar DCPS.jar &

    • 运行 tomcat 项目

    sh start.sh

    • 查看 JDK 版本

    java -version

    • 查看 MySQL 版本

    mysql -V

    • 登录 MySQL

    mysql -u root -p

稍作小结:

C:echo、awk、>、>>
R:rm、awk
U:echo、>、>>
D:cat、grep、tail、find

进阶语法

  • 数据类型:字符串、数字、数组
  • 变量:定义、使用、有效范围
  • 数学运算:(+、-、*、/、%)
  • 流程控制:if/else,循环(for、while)
  • 函数(方法):定义、使用

数据类型

  • 字符串

str=”2021”

  • 数字

str=2020

  • 数组

str=(2020 2021)

变量

(1)定义

以最常用的字符串为例。
_
所有变量默认值为空,所以通常情况下,定义和赋值一起使用。
(2)赋值
使用”=”将右边的值赋给左边的变量。
eg. str="右边"
(3)使用
格式:${变量名} 或 $变量名。
eg.${str}$str

(4)有效范围
变量默认为全局变量(这里的全局指的是当前脚本或者当前控制台窗口内)。
local 变量:表示在仅某方法内有效。
redonly 变量:表示当前变量为不可变常量。

脚本只会从上往下执行,也就意味着方法必须先定义后使用。这点和变量不同。尤其要注意。
*
定义数组。
arr=( ls )。格式:小括号,中间为多个值,以”空格”隔开。
eg. arr=( 1 2 3 )
使用变量:
a=$zs
数组的使用:
集合全部元素:${arr[
]},
第一个元素(对应的索引):
${arr[0]}
个数:${#arr[*]}
方法定义
function ffff() {
a=$1
},
调用方法fff
ffff zs
加减乘除:
a=$( 3 + 4 )
把命令的值赋值给变量。
a=$( 命令 )
或者a=命令(Tab上面的按键)
shell三件套,
grep,zgrep
awk
sed
sed ‘/^$/d’ file
echo > 置空,>>追加。
wc -l 查看文件行数
find也相当常用。

留一个作业,怎么查询服务进程号?怎么查询服务所在路径?怎么杀死一个服务?
vim 常用命令
增删改查。
i模式,添加内容。
o下一行(编辑模式)。O上一行。
删除:dd。以下10行,10dd。
删除剩余所有,1000000dd。
ctrl c删除并进去编辑模式。
ctrl d删除所在行光标右边的内容。
改:r替换。
查:
0行首,$行尾。
b,e快速跳转。
上下左右:hjkl
显示行号:冒号 set nu。
搜索:
/张三,按n,N向上向下查找

保持敬畏之心,愿你永远不用跑路
image.png