一起来学Shell脚本编程(二)

前言

目前正在出一个Shell脚本编程系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~

前面我们学习了Linux的一些基本命令,需要我们在终端手动去执行,但在处理一些复杂的操作就显得有点乏力,需要不停的执行,还很容易出错。有没有一种办法,可以帮助我们执行这一些列操作,方法当然有,那就是通过脚本去解决。

作为服务端开发,shell脚本编程还是要掌握一下的,可以做做基础性的运维,提高工作效率。

本系列主要以Linux Bash为主 ,好了, 废话不多说直接开整吧~

read

命令行从输入设备读入内容

bash 复制代码
#!/bin/bash

echo "1+1=?"
read NUM #输入
echo "1+1=$NUM"

结果:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z shell]# ./read.sh
1+1=?
2
1+1=2
[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

变量

支持自定义变量,定义变量时,变量名不用加符号$

bash 复制代码
variableName="variableName"

tip: 注意,变量名和等号之间不能有空格,我们习惯性会加个空格,所以要注意一下

命名规则:

  • 首个字符必须为字母(a-z,A-Z)
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号
  • 不能使用bash里的关键字(可用help命令查看保留关键字)

使用一个定义过的变量,只要在变量名前面加符号($)即可,如:

bash 复制代码
str="hello world"
echo $str
echo ${str}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

bash 复制代码
str="world"
echo "hello ${str}"

结果:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z shell]# ./var.sh
hello world
hello world
[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

变量可以重新赋值:

bash 复制代码
str="hello world"
echo $str

str="hello world1"
echo ${str}

结果:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z shell]# ./var.sh
hello world
hello world1
[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

readonly

在变量前面加readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变

bash 复制代码
str="hello world"
echo $str

readonly str

str="hello world1"
echo ${str}

结果:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z shell]# ./var.sh

./var.sh: line 6: str: readonly variable

[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

可以看到再次赋值的时候就报错了

unset

使用 unset 命令可以删除变量。语法:

bash 复制代码
str="hello world"
echo $str

readonly str
unset str

str="hello world1"
echo ${str}

结果:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z shell]# ./var.sh

./var.sh: line 5: unset: str: cannot unset: readonly variable
./var.sh: line 7: str: readonly variable

[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

这里大家要注意了 unset 不能删除只读变量

bash 复制代码
str="hello world"
echo $str

unset str

echo ${str}

结果:

bash 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z shell]# ./var.sh
hello world

[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

变量类型

  • 局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

  • 环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

  • shell变量

shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。

  • 特殊变量

变量名只能包含数字、字母和下划线 ,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

示例:

bash 复制代码
#!/bin/bash
echo "shell name: $0"
echo "第一个参数 : $1"
echo "第二个参数 : $2"
echo "所有参数: $@"
echo "所有参数: $*"
echo "所有参数的个数 : $#"

结果:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z shell]# ./var.sh a b c d e 
File shell name: ./var.sh
First 第一个参数 : a
Second 第二个参数 : b
Quoted 所有参数: a b c d e
Quoted 所有参数: a b c d e
Total 所有参数的个数 : 5
[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

退出状态

$? 可以获取上一个命令的退出状态

bash 复制代码
echo "exit $?"

结果:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z shell]# ./var.sh
exit 0
[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。

转义字符

bash 复制代码
转义字符	含义
\\	反斜杠
\a	警报,响铃
\b	退格(删除键)
\f	换页(FF),将当前位置移到下页开头
\n	换行
\r	回车
\t	水平制表符(tab键) 
\v	垂直制表符

默认不转义,需要加-e,上节给大家提到过,这些转义字符大家应该都比较熟知了,就不过多介绍了,在shell中也是可以使用这些字符的

结束语

大家平时在工作的时候就可以灵活运用起来了,多用用就熟悉了,大部分项目中都会用到脚本帮助我们去做一些自动化的工作,从而提高效率,还不容易出错~

本着把自己知道的都告诉大家,如果本文对有所帮助,点赞+关注鼓励一下呗~

Shell脚本编程相关文章

往期Linux相关文章

往期面试题相关文章

项目源码(源码已更新 欢迎star⭐️)

往期设计模式相关文章

设计模式项目源码(源码已更新 欢迎star⭐️)

Kafka 专题学习

项目源码(源码已更新 欢迎star⭐️)

ElasticSearch 专题学习

项目源码(源码已更新 欢迎star⭐️)

往期并发编程内容推荐

推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)

博客(阅读体验较佳)

相关推荐
薛定谔的猫_C8T61 小时前
程序人生-Hello’s P2P
c语言·汇编·程序人生·shell·二进制·计算机系统·hello
JohnYan3 小时前
Bun技术评估 - 04 HTTP Client
javascript·后端·bun
shangjg33 小时前
Kafka 的 ISR 机制深度解析:保障数据可靠性的核心防线
java·后端·kafka
青莳吖4 小时前
使用 SseEmitter 实现 Spring Boot 后端的流式传输和前端的数据接收
前端·spring boot·后端
我的golang之路果然有问题5 小时前
ElasticSearch+Gin+Gorm简单示例
大数据·开发语言·后端·elasticsearch·搜索引擎·golang·gin
mldong6 小时前
我的全栈工程师之路:全栈学习路线分享
前端·后端
噼里啪啦啦.7 小时前
SpringBoot统一功能处理
java·spring boot·后端
考虑考虑7 小时前
JPA自定义sql参数为空和postgresql遇到问题
spring boot·后端·spring
橘子青衫8 小时前
Java多线程编程:深入探索线程同步与互斥的实战策略
java·后端·性能优化
shengjk18 小时前
一文搞懂 python __init__.py 文件
后端