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

博客(阅读体验较佳)

相关推荐
刘大辉在路上4 小时前
突发!!!GitLab停止为中国大陆、港澳地区提供服务,60天内需迁移账号否则将被删除
git·后端·gitlab·版本管理·源代码管理
追逐时光者5 小时前
免费、简单、直观的数据库设计工具和 SQL 生成器
后端·mysql
初晴~6 小时前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱581366 小时前
InnoDB 的页分裂和页合并
数据库·后端
小_太_阳6 小时前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾6 小时前
scala借阅图书保存记录(三)
开发语言·后端·scala
星就前端叭7 小时前
【开源】一款基于Vue3 + WebRTC + Node + SRS + FFmpeg搭建的直播间项目
前端·后端·开源·webrtc
小林coding8 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
AI理性派思考者8 小时前
【保姆教程】手把手教你在Linux系统搭建早期alpha项目cysic的验证者&证明者
后端·github·gpu