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无要求,但是建议你写缩进,清晰代码的层次关系。
image

posted @ 2025-03-11 15:59  先ping  阅读(36)  评论(0)    收藏  举报