写在前面的话: 本人非专业运维人员,因业务需要曾做过一些 Shell 脚本的编写,但对 Shell 的理论的理解上还停留在很浅显的层面,由此导致的不严谨和错误还请各位多多批评和订正。
开胃菜(热热场)
适宜人群
略懂 Linux 基本操作命令或者零基础的同学,最好是零基础,因为我能教的也不多。。。
Shell 是什么?
大白话概括:Shell 脚本就是为了实现某种功能而进行的 Linux 命令的整合,是可以执行的程序。
公式:Shell脚本 = 命令1 + 命令2 + ... + 命令n
Shell 怎么用?
在开发界一直有一个不成文的规定,那就是无论学任何东西第一目标一定是输出”hello world”。毫不夸张地说,你离入门一个技能点有时真的就只差了一个”hello world”。
直接开门见山。
操作步骤:
- 使用 XShell 连接上 Linux 服务器(不会请自行百度);
- 创建一个 hello.sh,并在文件中输出
echo "hello world"
保存,退出; - 运行脚本
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.sh
、rm -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.log
、cat /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.com
、telnet 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
- ping、telnet:经常用于排查服务器网络、端口是否畅通。eg.
稍作小结:
C:echo、awk、>、>>
R:rm、awk
U:echo、>、>>
D:cat、grep、tail、find
进阶语法
- 数据类型:字符串、数字、数组
- 变量:定义、使用、有效范围
- 数学运算:(+、-、*、/、%)
- 流程控制:if/else,循环(for、while)
- 函数(方法):定义、使用
数据类型
- 字符串
str=”2021”
- 数字
str=2020
- 数组
变量
(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向上向下查找
保持敬畏之心,愿你永远不用跑路