Shell 脚本

注:文章参考《鸟哥的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 输出时,&gt 会输出为 >

执行 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 可以显示:

  1. 你目前的身份 (用 whoami )
  2. 你目前所在的目录 (用 pwd)
第二题

让使用者输入一个数字,程序可以由 1+2+3... 一直累加到使用者输入的数字为止。

第三题

撰写一支程序,他的作用是: 1.) 先查看一下 /root/test/logical 这个名称是否存在; 2.) 若不存在,则创建一个文件,使用 touch 来创建,创建完成后离开; 3.) 如果存在的话,判断该名称是否为文件,若为文件则将之删除后创建一个目录,文件名为 logical ,之后离开; 4.) 如果存在的话,而且该名称为目录,则移除此目录!

第四题

习题答案

第一题

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

第二题
第三题

总结

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

相关推荐
魔法白糖13 分钟前
怎么在window上打开ubuntu虚拟机?
linux·ubuntu
编码小笨猪14 分钟前
一文详谈Linux中的时间管理和定时器编程
linux·服务器
82782093715 分钟前
CentOS-stream-9 Zabbix的安装与配置
linux·centos·zabbix
m0_6948455727 分钟前
服务器如何配置防火墙管理端口访问?
linux·运维·服务器·前端
共享家95271 小时前
Linux进程
linux
xcs194051 小时前
运维 pgsql 安装完后某次启动不了
linux·运维·服务器
辣个蓝人QEX2 小时前
【ZYNQ Linux开发】使用 boot.scr 启动 Linux 报错 Bad Linux ARM64 Image magic! 调试过程记录
linux·运维·fpga开发·zynq·petalinux·zynq mpsoc
Brandon汐2 小时前
Linux中的shell脚本
linux·运维·服务器
欲盖弥彰13143 小时前
工控机安装lubuntu系统
linux·工控机·lubuntu