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

博客(阅读体验较佳)

相关推荐
希冀123几秒前
【操作系统】1.2操作系统的发展与分类
后端
GoppViper30 分钟前
golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
笔记·git·后端·学习·golang·github·源代码管理
爱上语文1 小时前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
serve the people2 小时前
springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档
java·spring boot·后端
罗政7 小时前
[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
vue.js·spring boot·后端
拾光师8 小时前
spring获取当前request
java·后端·spring
Java小白笔记10 小时前
关于使用Mybatis-Plus 自动填充功能失效问题
spring boot·后端·mybatis
JOJO___12 小时前
Spring IoC 配置类 总结
java·后端·spring·java-ee
白总Server13 小时前
MySQL在大数据场景应用
大数据·开发语言·数据库·后端·mysql·golang·php
Lingbug14 小时前
.Net日志组件之NLog的使用和配置
后端·c#·.net·.netcore