一起来学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⭐️)

博客(阅读体验较佳)

相关推荐
新知图书38 分钟前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
盛夏绽放1 小时前
Node.js 和 Socket.IO 实现实时通信
前端·后端·websocket·node.js
Ares-Wang1 小时前
Asp.net Core Hosted Service(托管服务) Timer (定时任务)
后端·asp.net
猿java1 小时前
Linux Shell和Shell脚本详解!
java·linux·shell
Rverdoser2 小时前
RabbitMQ的基本概念和入门
开发语言·后端·ruby
Tech Synapse3 小时前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
.生产的驴3 小时前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构
微信-since811923 小时前
[ruby on rails] 安装docker
后端·docker·ruby on rails
代码吐槽菌5 小时前
基于SSM的毕业论文管理系统【附源码】
java·开发语言·数据库·后端·ssm
豌豆花下猫5 小时前
Python 潮流周刊#78:async/await 是糟糕的设计(摘要)
后端·python·ai