注:文章参考《鸟哥的linux私房菜》、通义千问AI产品
认识 Shell
Linux 中的 Shell 就是 linux 内核的一个外层保护工具,并负责完成用户与内核之间的交互。
Shell 可以分为以下几类:
- Bourne Shell (简称 sh)
- C Shell(简称 csh)
- Korn Shell(简称 ksh)
- Bourne Again Shell(简称 bash)
其中目前 bash 最为流行。
对于 shell 脚本,其实就是把脚本的内容放到 shell 环境中运行,和 windows 的 批处理文件类似
Shell 变量

环境变量
常用 shell 环境变量
局部变量
#!/bin/bash
localVar="I am a local variable"
echo $localVar # 输出: I am a local variable bash
这个脚本中定义的变量无法再其他脚本文件中访问
位置变量

#!/bin/bash
echo "The first parameter is $1"
echo "The second parameter is $2"
echo "The name of the script is $0" #
执行: ./myscript.sh arg1 arg2
# 输出: # The first parameter is arg1
# The second parameter is arg2
# The name of the script is ./myscript.sh
编写 Shell 脚本
Hello World!

#!/bin/bash 在宣告这个 script 使用的 shell 名称,这个文件内的语法是 bash 的语法
接着以 # 开头的均为注释,在 shell 脚本中 # 代表行注释
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
这两行是在配置环境变量
echo -e "Hello World! \a \n"
这一行表示待会执行 shell 脚本时,屏幕上会显示 Hello World!,
相当于使用标准输出输出Hello World! 这个字符串
echo命令参数详解


上图展示了两种执行 shell 脚本的方式,创建 shell 脚本默认没有执行权限
第一种方式:sh hello.sh
这种方式不需要 hello.sh 具有执行权限
第二种方式:修改 hello.sh 的权限为创建者可执行,其他用户只读
然后执行 ./hello.sh
第三种方式: source hello.sh
这种方式也可以执行 shell 脚本,但会因为写了 exit 0 退出整个 shell
这三种方式均可以执行 shell 脚本
source, sh script, ./script 的执行方式差异
sh script 和 ./script 相当于在父 shell 中开了个子程序
这种方式在 shell 脚本中创建的任何变量不会保存到父程序中
source hello.sh
这种方式是直接将脚本放在当前shell 环境中运行,脚本中创建的变量会保存到父程序中
测试
从上图可以看出执行方式的差异
这也是为啥你不登出系统而要让某些写入 ~/.bashrc 的设置生效时,需要使用" source ~/.bashrc "而不能使用" bash ~/.bashrc "是一样的
输入输出语句

read命令是从标准输入读入一行数据,然后赋值给一个或多个变量
read 命令相关参数
read -p "Please input your first name: " firstname # 提示使用者输入
这里是先提示 "Please input your first name: "
用户输入后将值赋给 firstname
read -p "Please input your last name: " lastname # 提示使用者输入
这里是先提示 "Please input your last name: "
用户输入后将值赋给 lastname
echo -e "\nYour full name is: {firstname} {lastname}" # 结果由屏幕输出
这里{firstname} 和 {lastname} 是 shell 脚本中取出一个变量的值的方法
创建前天、昨天、今天的日期文件

filename=${fileuser:-"filename"} # 开始判断有否配置文件名
这一行是一种默认配置,比如用没输入文件名,那filename就会是后面的字符串"filename"
date1=$(date --date='2 days ago' +%Y%m%d) # 前两天的日期
date2=$(date --date='1 days ago' +%Y%m%d) # 前一天的日期
date3=$(date +%Y%m%d) # 今天的日期
这里$()是截取输出给左边的变量
date 是 Linux/Unix 系统中用于显示或设置系统时间与日期的命令。
常用格式化选项
其他参数
--date= 后面可以写以下内容
相对时间
具体时间
时间偏移
自然语言
执行shell 脚本
四则运算

推荐使用var=$((运算内容)) 这种格式进行四则运算,容易记忆
> 用 echo 输出时,> 会输出为 >
执行 shell 脚本
条件分支语句
if 条件语句

case 分支语句

案例
test 指令

比如这一行命令
-e 判断文件名是否存在
这一行相当于伪代码:
if test -e /dmtsai is true:
echo "exist"
else:
echo "Not exist"
可用参数

利用判断符号 []
注意在 [ 和 ] 两侧加上空格

循环语句
for 循环
语法:for...do...done
案例一
案例二
案例三
while循环
语法:while...do...done
案例
until
语法:until...do...done
案例
函数 Function
语法:function 函数名(){}
function里面的 return 只能返回状态码(只能是 0~255)
推荐使用 echo 输出结果,然后使用$() 获取结果
案例
习题(答案在后面)
第一题
请创建一支 script ,当你执行该 script 的时候,该 script 可以显示:
- 你目前的身份 (用 whoami )
- 你目前所在的目录 (用 pwd)
第二题
让使用者输入一个数字,程序可以由 1+2+3... 一直累加到使用者输入的数字为止。
第三题
撰写一支程序,他的作用是: 1.) 先查看一下 /root/test/logical 这个名称是否存在; 2.) 若不存在,则创建一个文件,使用 touch 来创建,创建完成后离开; 3.) 如果存在的话,判断该名称是否为文件,若为文件则将之删除后创建一个目录,文件名为 logical ,之后离开; 4.) 如果存在的话,而且该名称为目录,则移除此目录!
第四题
习题答案
第一题

.sh后缀可以不加,但第一行必须有#!/bin/bash
第二题

第三题

总结
个人感觉,光是把这些内容看完、敲完,对 Shell 的掌握还远远不够。因此,我打算新开一个专栏,每天练习一道 Shell 编程题,不断积累实战经验。也愿与各位朋友共勉,在 Shell 的世界里越走越远!