01-shell基础
1.什么是编程语言
1.1.什么是编程
编程语言是一种让人类能够与计算机进行沟通和交互,用于编写计算机程序的形式化语言,它定义了一系列的规则、符号和语法结构,用于向计算机传达特定的指令和操作,以实现各种功能和任务。
1.2.编译性语言
编译性语言是一种在执行程序之前,需要通过编译器将源代码一次性翻译成目标机器的机器语言代码(如二进制代码)的编程语言。这个翻译过程称为编译,生成的机器语言代码可以直接在目标机器上运行。常见的编译性语言有 C、C++、Java(Java 比较特殊,它先编译成字节码,再由 JVM 解释执行字节码,但从编译成字节码这一步看具有编译语言的特征)、Go 等。
以 C 语言为例,使用编译器(如 GCC)将编写好的 .c 文件编译成可执行文件的过程如下:
# 假设源文件名为 example.c
gcc example.c -o example
# 运行生成的可执行文件
./example
1.3.解释性语言
解释性语言是在程序运行时,由解释器逐行读取源代码,并将其逐行翻译成机器语言并立即执行,而不需要事先将整个程序编译成机器语言代码。常见的解释性语言有 Shell、Python、JavaScript、Ruby 等。
以 Python 为例,直接运行 Python 脚本时,Python 解释器会逐行解释并执行代码:
# 假设源文件名为 example.py
python example.py
1.4.编译性语言和解释性语言的区别
| 对比维度 | 编译性语言 | 解释性语言 |
|---|---|---|
| 执行速度 | 快,提前编译成机器码,运行时直接执行 | 慢,运行时逐行解释代码,有性能开销 |
| 开发效率 | 低,编译耗时,语法严格,细节处理多 | 高,无需编译,代码修改后可立即运行,语法简洁 |
| 可移植性 | 差,编译后的机器码针对特定平台,需重新编译 | 好,有对应解释器即可跨平台运行 |
| 内存管理 | 需手动管理,易出现内存问题 | 自动管理,有垃圾回收机制减轻负担 |
| 调试难度 | 编译时严格检查,但定位错误可能耗时 | 运行时逐行解释,定位错误较直观,但动态特性使原因难追踪 |
2.什么是shell
Shell 本质上是一个命令解释器,它接收用户输入的命令,对命令进行解析和处理,然后将处理结果传递给操作系统内核执行,并将执行结果返回给用户。它屏蔽了操作系统底层的复杂性,使用户可以更方便地使用操作系统的功能。
2.1.shell的作用

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

shell脚本语言很适合处理纯文本类型数据,且Linux的哲学思想就是一切皆文件,如日志、配置文件、文本、网页文件,大多数都是纯文本类型的,因此shell可以方便的进行文本处理,好比强大的Linux三剑客(grep、sed、awk)
shell脚本就是把一堆命令和数据的集合,放在一起去执行;
shell脚本可以包括N个变量、循环、条件判断、函数等;
特定的格式 + 特定的语法 + 系统命令 + 文件数据 = 脚本
shell可以解决运维什么问题?
1. 系统初始化脚本,如ssh配置、yum源、防火墙、ntp、基础软件安装,这一系列的步骤,写成脚本。
2. 定时备份数据,shell脚本 + crontab,每天夜里12点备份数据库。
3. nginx日志切割脚本。
4. 服务管理脚本,如nginx,mysql启停脚本。
5. 如代码上线脚本,将开发写好的代码,发布交给nginx。
6. 如自己开发一个跳板机脚本等。
简单说就是你的运维工作日常,可以用脚本完成自动化,提升效率,节省时间,多点时间和妹子聊天不香吗。
3.shell光速入门
3.1.shell的规范
1. shell脚本要做到见名知意,正式的脚本,别瞎写a.sh b.sh 容易被打。。
2. 虽然脚本是文本类型,但是建议以.sh结尾。vim也能提供颜色支持。
3. 给脚本加上注释(英文最好,中文写在你的笔记里),包括了脚本的创建时间,作者,作用等信息;
4. 创建好可以管理你脚本的目录。
5. 创建统一管理脚本的目录,别乱放,回头找不到。
脚本实例:
#!/bin/bash #! 这个符号在计算机中读作shebang,表示指定用什么解释器运行脚本
# Author: www.yuchaoit.cn 877348180@qq.com
# Create Time: 2022/05/25
# Script Description: this is my first shell script.
3.2.vim模板创建
打开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) 2025 \n"
\." * \n"
\." **************************************************************************/ \n"
\." \n"
\." \n"
\." \n"
\."/** \n"
\." * @File:".expand("%")." \n"
\." * @Author FUNLYP \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: FUNLYP \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: FUNLYP \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()
这个配置文件,可以自动识别php、python、sh后缀的脚本,提供脚本模板。
3.3. 新建一个shell脚本
[root@client-110 ~]# mkdir /my_sh
[root@client-110 ~]# cd /my_sh/
[root@client-110 my_sh]# vim first.sh
[root@client-110 my_sh]# cat first.sh
#!/bin/bash
# ***************************************************************************
# *
# * @File:first.sh
# * @Author: FUNLYP
# * @Date:2025-03-11 11:08
# * @Version 1.0
# * @Description: Shell script
# * @Copyright (c) all right reserved
#*
#**************************************************************************/
echo "This is my first script for shell."
exit 0
执行脚本
[root@client-110 my_sh]# bash first.sh
This is my first script for shell.
3.4.执行shell方式
3.4.1.执行命令方式不同
[root@client-110 my_sh]# echo 'echo Hello EXCEL' > t1.sh
[root@client-110 my_sh]# chmod u+x t1.sh
[root@client-110 my_sh]# ./t1.sh
Hello EXCEL
3.4.2.首行是否指定解释器shebang
1.不指定 #!/usr/bin/env 解释器 ,导致./file 直接运行以bash去执行
[root@client-110 my_sh]# echo 'print("Hello word")' > p1.py
[root@client-110 my_sh]# chmod u+x p1.py
[root@client-110 my_sh]# ./p1.py
./p1.sh:行1: 未预期的符号 `"Hello word"' 附近有语法错误
./p1.sh:行1: `print("Hello word")'
2.不同的脚本必须指定解释器,才能正确运行
[root@client-110 my_sh]# sed -i '1i #!/usr/bin/env python' p1.py
[root@client-110 my_sh]# cat p1.py
#!/usr/bin/env python
print("Hello word")
[root@client-110 my_sh]# ./p1.py
Hello word
3.4.3.强制用解释器去执行脚本
[root@client-110 my_sh]# python p1.py
Hello word
[root@client-110 my_sh]# python t1.sh
File "t1.sh", line 1
echo Hello EXCEL
^
SyntaxError: invalid syntax
[root@client-110 my_sh]# bash t1.sh
Hello EXCEL
[root@client-110 my_sh]# bash p1.py
p1.py:行2: 未预期的符号 `"Hello word"' 附近有语法错误
p1.py:行2: `print("Hello word")'
3.4.4.调试shell执行
先准备一个脚本
[root@client-110 my_sh]# vim login.sh
[root@client-110 my_sh]# cat login.sh
#!/bin/bash
# 用户输入交互
read -p "请输入账号:" username
read -p "请输入密码:" pwd
# 账号密码验证逻辑
if [[ "${username}" == "funlyp" && "${pwd}" == "mima6666" ]];then
echo "尊贵的SVIP,欢迎您登录!"
else
echo "什么玩意?别搞"
fi
exit 0
[root@client-110 my_sh]# bash login.sh
请输入账号:funlyp
请输入密码:mima6666
尊贵的SVIP,欢迎您登录!
将脚本文件语法改错并执行,删掉了fi
[root@client-110 my_sh]# vim login.sh
[root@client-110 my_sh]# vim login.sh
[root@client-110 my_sh]# bash login.sh
请输入账号:user
请输入密码:user
login.sh:行15: 语法错误: 未预期的文件结尾
使用-vx参数运行脚本调试
[root@client-110 my_sh]# bash -vx login.sh
#!/bin/bash
# 用户输入交互
read -p "请输入账号:" username
+ read -p 请输入账号: username
请输入账号:user
read -p "请输入密码:" pwd
+ read -p 请输入密码: pwd
请输入密码:pwd
# 账号密码验证逻辑
if [[ "${username}" == "funlyp" && "${pwd}" == "mima6666" ]];then
echo "尊贵的SVIP,欢迎您登录!"
else
echo "什么玩意?别搞"
exit 0
login.sh:行15: 语法错误: 未预期的文件结尾
修复语法错误,结尾加上fi,再执行,且显示代码详细加载的过程,用于调试代码。
[root@client-110 my_sh]# vim login.sh
[root@client-110 my_sh]# bash -vx login.sh
#!/bin/bash
# 用户输入交互
read -p "请输入账号:" username
+ read -p 请输入账号: username
请输入账号:user
read -p "请输入密码:" pwd
+ read -p 请输入密码: pwd
请输入密码:pwd
# 账号密码验证逻辑
if [[ "${username}" == "funlyp" && "${pwd}" == "mima6666" ]];then
echo "尊贵的SVIP,欢迎您登录!"
else
echo "什么玩意?别搞"
fi
+ [[ user == \f\u\n\l\y\p ]]
+ echo 什么玩意?别搞
什么玩意?别搞
exit 0
+ exit 0
也可以通过set -x 和 set +x 设定一个范围进行调试。
3.4.6代码编写细节语法(重点)
1.成对儿出现的符号,一次性写好,别遗漏。
如下符号,一次性,首尾都给写好。
例如大括号{}
中括号[]
小括号()
单引号' '
双引号" "
反引号` `
2.shell语法要求括号内必须有空格。
中括号[ ]两端需要留有空格,不然会报错
书写时即可留出空格然后书写内容。
如果不知道大括号{},中括号[],小括号(),到底哪种括号需要两端留空格,可以在书写这些括号的时候两端都保留空格来进行书写,这样可以有效避免因空格导致的各种错误。
例如上述代码案例的 中括号。
[[ 语法要求前后都预留一个空格 ]]
if [[ "${username}" == "pyyu" && "${pwd}" == "www.yuchaoit.cn" ]];then
中括号[ ]两端需要留有空格,不然会报错
书写时即可留出空格然后书写内容。
如果不知道大括号{},中括号[],小括号(),到底哪种括号需要两端留空格,可以在书写这些括号的时候两端都保留空格来进行书写,这样可以有效避免因空格导致的各种错误。
例如上述代码案例的 中括号。
[[ 语法要求前后都预留一个空格 ]]
if [[ "${username}" == "pyyu" && "${pwd}" == "www.yuchaoit.cn" ]];then
3.流程控制语句,习惯性,先写好流程,再添加内容。
例1:if语句格式一次书写完成
if 条件语句
then
条件成立后执行的代码
fi
例2:for循环格式一次书写完成
for条件内容
do
条件成立后执行的代码
done
提示:while、until、case等语句也是一样
防止自己忘了,导致低级的语法错误。
4.虽然shell无要求,但是建议你写缩进,清晰代码的层次关系。



浙公网安备 33010602011771号