shell基础理论,什么是shell

shell理论

编程语言

编程的目的
将人类的思想流程按照某种能够被计算机识别的表达方式传递给计算机,从而达到让计算机能够像人脑/电脑一样自动执行的效果。

编译与解释

编译型语言

​ 使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。

特点

​ 在编译型语言写的程序执行之前,需要一个专门的编译过程,把源代码编译成机器语言的文件,如exe格式的文件,以后要再运行时,直接使用编译结果即可,如直接运行exe文件。因为只需编译一次,以后运行时不需要编译,所以编译型语言执行效率高。

总结

1.一次性的编译成平台相关的机器语言文件,运行时脱离开发环境,运行效率高;

2.与特定平台相关,一般无法移植到其他平台;

3.现有的C、C++、Objective等都属于编译型语言。

go语言实例
1、下载golang编译器
yum install epel-release golang -y
2、编写代码
[root@bogon    Tue Jun 21 21:07:25   
 /opt]# cat t1.go 
package main

import "fmt"

func main() {
    fmt.Println("Holle,我是木耳")
}
3、编译代码,生成二进制命令
[root@bogon    Tue Jun 21 21:07:29   
 /opt]# go build t1.go 
[root@bogon    Tue Jun 21 21:08:26   
 /opt]# ll
total 1732
-rwxr-xr-x. 1 root root 1766198 Jun 21 21:08 t1
-rw-r--r--. 1 root root      82 Jun 21 21:07 t1.go
[root@bogon    Tue Jun 21 21:11:36   
 /opt]# file t1
t1: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

4、运行代码
[root@bogon    Tue Jun 21 21:11:48   
 /opt]# ./t1 
Holle,我是木耳
5、也可加入PATH变量
mv t1 /usr/local/bin


解释型语言

使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。是代码在执行时才被解释器一行行动态翻译和执行,而不是在执行之前就完成翻译。

特点

解释型语言不需要事先编译,其直接将源代码解释成机器码并立即执行,所以只要某一平台提供了相应的解释器即可运行该程序。

总结

1.解释型语言每次运行都需要将源代码解释称机器码并执行,效率较低;

2.只要平台提供相应的解释器,就可以运行源代码,所以可以方便源程序移植;

3.Python等属于解释型语言。

python脚本
1、下载python3解释器
yum install python3 python3-devel -y
2、编写代码
[root@bogon    Tue Jun 21 21:16:42   
 /opt]# cat t2.py 
print("Holle 我是木耳")
3、运行
[root@bogon    Tue Jun 21 21:16:44   
 /opt]# python3 t2.py 
Holle 我是木耳

bash脚本
[root@bogon    Tue Jun 21 21:18:55   
 /opt]# cat t3.sh 
echo "Holle 我是木耳"
运行
[root@bogon    Tue Jun 21 21:18:50   
 /opt]# bash t3.sh 
Holle 我是木耳

区别
编译型
  二进制执行速度快
  依赖平台架构
  保护源代码
  底层工具开发,操作系统,超大型应用,高并发型应用,都是编译型语言开发。

解释型
  跨平台性能好
  执行过程较慢(相对计算机而言,其实人类感受不到的。。)而且你块那几秒对你有啥用?
  源码暴露在外,不安全
  适合开发各种脚本,完成自动化工作
  对速度要求不是太高的应用开发,如网站开发。

shell

在大多数Linux发行版里,例如centos,可以简单的用组合键来访问Linux控制台,也就是ctrl+F1~F7。

现在更多的使用xshell这样的控制终端,来连接管理我们的Linux机器。

以centos为例,默认的shell都是GNU bash shell,支持一些特性,例如

man手册
tab补全
shell指令
GNU bash shell是在系统普通用户登陆时,作为普通程序运行,这个规则是/etc/passwd中指定的条目
作用
shell的作用是

解释执行用户输入的命令或程序等
用户输入一条命令,shell就解释一条
键盘输入命令,Linux给与响应的方式,称之为交互式

shell是一块包裹着系统核心的壳,处于操作系统的最外层,与用户直接对话,把用户的输入,解释给操作系统,然后处理操作系统的输出结果,输出到屏幕给与用户看到结果。

shell和运维

shell脚本就是把一堆命令和数据的集合,放在一起去执行;
shell脚本可以包括N个变量、循环、条件判断、函数等;

特定的格式 + 特定的语法 + 系统命令 + 文件数据 = 脚本
可以解决的问题
1.系统初始化脚本,如ssh配置、yum源、防火墙、ntp、基础软件安装,这一系列的步骤,写成脚本。

2. 定时备份数据,shell脚本 + crontab,每天夜里12点备份数据库。

3. nginx日志切割脚本。

4. 服务管理脚本,如nginx,mysql启停脚本。

5. 如代码上线脚本,将开发写好的代码,发布交给nginx。

6. 如自己开发一个跳板机脚本等。

简单说就是你的运维工作日常,可以用脚本完成自动化,提升效率,节省时间,多点时间和妹子聊天不香吗。

shell的必备工具

熟悉vim
掌握linux命令
掌握正则与三剑客

学好shell编程秘诀

1.充分利用好课上时间,一定要主动思考,别等答案
2.充分理解知识点的语法,概念
3.先模仿老师的脚本开发,看懂语法
4.消化吸收老师的脚本思路后,自己模仿,改造
5.有思路后,按照自己的意愿,开发脚本

shell的书写规则

1. shell脚本要做到见名知意,正式的脚本,别瞎写a.sh  b.sh 容易被打。。

2. 虽然脚本是文本类型,但是建议以.sh结尾。vim也能提供颜色支持。

3. 给脚本加上注释(英文最好,中文写在你的笔记里),包括了脚本的创建时间,作者,作用等信息;

4. 创建好可以管理你脚本的目录。

5. 创建统一管理脚本的目录,别乱放,回头找不到。

vim插件模板

vim  ~/.vimrc
放入一下代码
syntax on
set nocompatible
"set number
"filetype on
"set history=1000
"set background=dark
""set autoindent
"set smartindent
"set tabstop=4
"set shiftwidth=4
"set showmatch
"set guioptions-=T
"set ruler
"set nohls
"set incsearch
""set fileencodings=utf-8

if &term=="xterm"
    set t_Co=8
    set t_Sb=^[[4%dm
    set t_Sf=^[[3%dm
endif
function AddFileInformation_php()
      let infor = "<?php\n"
      \." ***************************************************************************\n"
      \." * \n"
      \." * Copyright (c) 2014 \n"
      \." *  \n"
      \." **************************************************************************/ \n"
      \." \n"
      \." \n"
      \." \n"
      \."/** \n"
      \." * @file:".expand("%")." \n"
      \." * @author your name(www.yuchaoit.cn) \n"
      \." * @date ".strftime("%Y-%m-%d %H:%M")." \n"
      \." * @version 1.0  \n"
      \." **/ \n"
      \." \n"
      \." \n"
      \." \n"
      \." \n"
      \." \n"
      \." \n"
      \."?>"
      silent  put! =infor
endfunction
autocmd BufNewFile *.php call AddFileInformation_php()

function AddFileInformation_sh()
      let infor = "#!/bin/bash\n"
      \."\n"
      \."# ***************************************************************************\n"
      \."# * \n"
      \."# * @file:".expand("%")." \n"
      \."# * @author:www.yuchaoit.cn \n"
      \."# * @date:".strftime("%Y-%m-%d %H:%M")." \n"
      \."# * @version 1.0  \n"
      \."# * @description: Shell script \n"
      \."# * @Copyright (c)  all right reserved \n"
      \."#* \n"
      \."#**************************************************************************/ \n"
      \."\n"
      \."\n"
      \."\n"
      \."\n"
      \."exit 0"
      silent  put! =infor
endfunction
autocmd BufNewFile *.sh call AddFileInformation_sh()

function AddFileInformation_py()
      let infor = "#!/usr/bin/env python\n"
      \."# -*- coding: utf-8 -*-\n"
      \."# ************************************************************************ \n"
      \."# * \n"
      \."# * @file:".expand("%")." \n"
      \."# * @author:www.yuchaoit.cn \n"
      \."# * @date:".strftime("%Y-%m-%d %H:%M")." \n"
      \."# * @version 1.0  \n"
      \."# * @description: Python Script \n"
      \."# * @Copyright (c)  all right reserved \n"
      \."# * \n"
      \."#************************************************************************* \n"
      \."\n"
      \."import os,sys"
      \."\n"
      \."print u'''中文'''\n"
      \."\n"
      \."exit()"
      silent  put! =infor
endfunction
autocmd BufNewFile *.py call AddFileInformation_py()

测试插件编写shell

编写第一个shell脚本

[root@bogon    Tue Jun 21 21:39:48   
 /opt]# cat t4.sh 
#!/bin/bash

# ***************************************************************************
# * 
# * @file:t4.sh 
# * @author:www.yuchaoit.cn 
# * @date:2022-06-21 21:39 
# * @version 1.0  
# * @description: Shell script 
# * @Copyright (c)  all right reserved 
#* 
#**************************************************************************/ 



echo '我是联齐朝'
exit 0

执行
bash t4.sh
[root@bogon    Tue Jun 21 21:39:54   
 /opt]# bash t4.sh
我是联齐朝

执行shell方式

执行命令不同
[root@bogon    Tue Jun 21 21:41:04   
 /opt]# bash t4.sh 
我是联齐朝

[root@bogon    Tue Jun 21 22:57:50   
 /opt]# source t4.sh 
我是联齐朝

首行是否指定解释器shebang
1.不指定 #!/usr/bin/env 解释器 ,导致./file  直接运行以bash去执行、
[root@bogon    Tue Jun 21 22:59:42   
 /opt]# cat t2.py 
print("Holle 我是木耳")
[root@bogon    Tue Jun 21 23:00:04   
 /opt]# chmod u+x t2.py
[root@bogon    Tue Jun 21 23:00:16   
 /opt]# ./t2.py 
./t2.py: line 1: syntax error near unexpected token `"Holle 我是木耳"'(未预期的符号 ` 附近有语法错误)
./t2.py: line 1: `print("Holle 我是木耳")'

2. 不同的脚本必须指定解释器,才能正确运行
[root@bogon    Tue Jun 21 23:01:56   
 /opt]# cat t2.py 
#!/usr/bin/env python3
print("Holle 我是木耳")
[root@bogon    Tue Jun 21 23:02:00   
 /opt]# ./t2.py 
Holle 我是木耳

强制用解释器去执行脚本
[root@bogon    Tue Jun 21 23:03:17   
 /opt]# python3 t2.py 
Holle 我是木耳
[root@bogon    Tue Jun 21 23:03:26   
 /opt]# bash t4.sh 
我是联齐朝

shell和python和运维

Shell

shell脚本的优势在于,最贴切linux底层,直接使用linux原生命令,效率很高,适合处理偏向操作系统底层的脚本。

对于一些常见的系统脚本,用shell去开发会更简单,更快速,例如一键部署nginx集群,系统内核参数优化,服务启动脚本,日志分析解析三剑客的提取脚本等。

虽然其他语言,如python也能实现这个效果,但是考虑到学习成本,开发效率,以及如果通过python管理操作系统的模块去写脚本,这个python语言对操作系统的效率,远不如linux命令来的强大。

因此对于基本的系统维护需求,用shell脚本会更符合易用、快速、高效的原则。

python

python是最近几年运维自动化非常流行的语言,随着运维人员开发能力的提升,以及运维对编程的需求加大,像知乎网、豆瓣网、国外的INS网都是python开发的,虽说后来有更新。

因此python很适合web开发,实现网站的后端功能,这个是shell完成不了的,shell仅仅是维护linux系统的脚本语言。

python除了可以开发网站的web服务,以及运维的开源工具,如ansible,saltstack,openstack虚拟化平台,都是python开发而来。

因此运维的第二语言以python为主,适合开发更复杂,更强大的运维软件,运维系统,而不是简单的运维脚本了。

调试shell执行

通过set -x 和 set +x 设定一个范围,会显示对应的代码,以及执行结果。
[root@bogon    Tue Jun 21 23:06:57   
 /opt]# cat denglu.sh 
#!/bin/bash

# ***************************************************************************
# * 
# * @file:denglu.sh 
# * @author:www.yuchaoit.cn 
# * @date:2022-06-21 23:06 
# * @version 1.0  
# * @description: Shell script 
# * @Copyright (c)  all right reserved 
#* 
#**************************************************************************/ 


#!/usr/bin/env bash
# set -x 用于在运行结果之前,先输出对应的命令,用于精准调试shell脚本逻辑
set -x

# 用户输入交互
read -p "请输入账号:"  username
read -p "请输入密码:"  pwd
# set +x 表示关闭这个x调试功能
set +x

# 账号密码验证逻辑
if [[ "${username}" == "afei" && "${pwd}" == "111111" ]];then
    echo "尊贵的SVIP,欢迎您登录!"
else
    echo "什么玩意?请你先注册!"
fi

exit 0


执行脚本
[root@bogon    Tue Jun 21 23:09:08   
 /opt]# bash denglu.sh 
+ read -p 请输入账号: username
请输入账号:xiaoming
+ read -p 请输入密码: pwd
请输入密码:111111
+ set +x
尊贵的SVIP,欢迎您登录!
[root@bogon    Tue Jun 21 23:09:50   
 /opt]# bash denglu.sh 
+ read -p 请输入账号: username
请输入账号:asdada
+ read -p 请输入密码: pwd
请输入密码:asdasda
+ set +x
什么玩意?请你先注册!

加上脚本的详细执行过程,通过 bash -vx参数显示详细过程。

[root@bogon    Tue Jun 21 23:10:01   
 /opt]# bash -vx denglu.sh 
#!/bin/bash

# ***************************************************************************
# * 
# * @file:denglu.sh 
# * @author:www.yuchaoit.cn 
# * @date:2022-06-21 23:06 
# * @version 1.0  
# * @description: Shell script 
# * @Copyright (c)  all right reserved 
#* 
#**************************************************************************/ 


#!/usr/bin/env bash
# set -x 用于在运行结果之前,先输出对应的命令,用于精准调试shell脚本逻辑
set -x
+ set -x

# 用户输入交互
read -p "请输入账号:"  username
+ read -p 请输入账号: username
请输入账号:dasd
read -p "请输入密码:"  pwd
+ read -p 请输入密码: pwd
请输入密码:dasda
# set +x 表示关闭这个x调试功能
set +x
+ set +x

# 账号密码验证逻辑
if [[ "${username}" == "xiaoming" && "${pwd}" == "111111" ]];then
    echo "尊贵的SVIP,欢迎您登录!"
else
    echo "什么玩意?请你先注册!"
fi
什么玩意?请你先注册!

exit 0

# 用户输入交互
read -p "请输入账号:"  username
+ read -p 请输入账号: username
请输入账号:xiaoming
read -p "请输入密码:"  pwd
+ read -p 请输入密码: pwd
请输入密码:111111
# set +x 表示关闭这个x调试功能
set +x
+ set +x

# 账号密码验证逻辑
if [[ "${username}" == "xiaoming" && "${pwd}" == "111111" ]];then
    echo "尊贵的SVIP,欢迎您登录!"
else
    echo "什么玩意?请你先注册!"
fi
尊贵的SVIP,欢迎您登录!

exit 0

去掉set -x 和set +x ,这个作为了解,一般不用。

并且模拟代码写错了,例如忘记了结尾的fi。


[root@bogon    Tue Jun 21 23:14:22   
 /opt]# cat denglu.sh 
#!/bin/bash

# ***************************************************************************
# * 
# * @file:denglu.sh 
# * @author:www.yuchaoit.cn 
# * @date:2022-06-21 23:06 
# * @version 1.0  
# * @description: Shell script 
# * @Copyright (c)  all right reserved 
#* 
#**************************************************************************/ 


#!/usr/bin/env bash
# set -x 用于在运行结果之前,先输出对应的命令,用于精准调试shell脚本逻辑

# 用户输入交互
read -p "请输入账号:"  username
read -p "请输入密码:"  pwd
# set +x 表示关闭这个x调试功能

# 账号密码验证逻辑
if [[ "${username}" == "xiaoming" && "${pwd}" == "111111" ]];then
    echo "尊贵的SVIP,欢迎您登录!"
else
    echo "什么玩意?请你先注册!"

exit 0


报错
[root@bogon    Tue Jun 21 23:14:15   
 /opt]# bash denglu.sh 
请输入账号:xiaoming
请输入密码:111111
denglu.sh: line 31: syntax error: unexpected end of file


显示详细过程
#!/usr/bin/env bash
# set -x 用于在运行结果之前,先输出对应的命令,用于精准调试shell脚本逻辑

# 用户输入交互
read -p "请输入账号:"  username
+ read -p 请输入账号: username
请输入账号:xiaoming
read -p "请输入密码:"  pwd
+ read -p 请输入密码: pwd
请输入密码:111111
# set +x 表示关闭这个x调试功能

# 账号密码验证逻辑
if [[ "${username}" == "xiaoming" && "${pwd}" == "111111" ]];then
    echo "尊贵的SVIP,欢迎您登录!"
else
    echo "什么玩意?请你先注册!"

exit 0

denglu.sh: line 31: syntax error: unexpected end of file

修复Bug,结尾加上fi,再执行,且显示代码详细加载的过程,用于调试代码。

#!/usr/bin/env bash
# set -x 用于在运行结果之前,先输出对应的命令,用于精准调试shell脚本逻辑

# 用户输入交互
read -p "请输入账号:"  username
+ read -p 请输入账号: username
请输入账号:xiaoming
read -p "请输入密码:"  pwd
+ read -p 请输入密码: pwd
请输入密码:111111
# set +x 表示关闭这个x调试功能

# 账号密码验证逻辑
if [[ "${username}" == "xiaoming" && "${pwd}" == "111111" ]];then
    echo "尊贵的SVIP,欢迎您登录!"
else
    echo "什么玩意?请你先注册!"
fi
+ [[ xiaoming == \x\i\a\o\m\i\n\g ]]
+ [[ 111111 == \1\1\1\1\1\1 ]]
+ echo 尊贵的SVIP,欢迎您登录!
尊贵的SVIP,欢迎您登录!

exit 0
+ exit 0

代码编写细节语法(重点)

1.成对儿出现的符号,一次性写好,别遗漏。

例如大括号{}
中括号[]
小括号()
单引号' '
双引号" "
反引号` `

2.shell语法要求括号内必须有空格。

中括号[ ]两端需要留有空格,不然会报错
书写时即可留出空格然后书写内容。
如果不知道大括号{},中括号[],小括号(),到底哪种括号需要两端留空格,可以在书写这些括号的时候两端都保留空格来进行书写,这样可以有效避免因空格导致的各种错误。

例如上述代码案例的 中括号。
[[ 语法要求前后都预留一个空格 ]]

if [[ "${username}" == "pyyu" && "${pwd}" == "www.yuchaoit.cn" ]];then

3.流程控制语句,习惯性,先写好流程,再添加内容。

例1:if语句格式一次书写完成

if 条件语句
then
条件成立后执行的代码
fi



例2:for循环格式一次书写完成

 for条件内容
 do
 条件成立后执行的代码
 done


 提示:while、until、case等语句也是一样

 意思就是告诉大家,可以先吧语法框架写好,防止自己忘了,导致低级的语法错误。

4.虽然shell无要求,但是建议你写缩进,清晰代码的层次关系。

posted @ 2022-08-02 19:50  张开嘴  阅读(163)  评论(0编辑  收藏  举报