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 的世界里越走越远!

相关推荐
ZKf30FkG1 小时前
在 CentOS 7.9 中 Node 18.20.2 安装指南
linux·运维·centos
Virgocloud1 小时前
Centos更换镜像源-腾讯云镜像源
linux·centos·腾讯云
魂尾ac1 小时前
VMware Workstation Pro下Centos 7.9 安装
linux·运维·centos
Ven%2 小时前
Linux环境下使用WPS比较word文档并生成修订
linux·服务器·python·wps
samoyan3 小时前
在特定时间点安排任务在 Linux 系统上运行的方法
linux·运维·python
明明在干嘛3 小时前
【Linux】Linux挂载硬盘
linux·运维·服务器
2301_793102493 小时前
Linux——库文件生成和使用
linux·运维·服务器
搬码临时工3 小时前
如何自建服务器并开启公网IP:本地内网网址让外网访问详细教学
linux·服务器·tcp/ip
KIDAKN3 小时前
JavaEE->多线程1
linux·运维·服务器
从零开始学习人工智能3 小时前
如何导出和迁移离线 Conda 环境
linux·服务器·conda