【Linux操作系统 | 第19篇-进阶篇】Shell编程(上篇)
文章目录
- 🧐初识Shell
- 什么是Shell
- 为什么要学习Shell🤔
- Shell脚本的编写要求和执行方式👏
- 脚本格式要求
- 脚本的常见执行方式
- 第一个Shell脚本
- 🥝Shell变量
- 系统变量+set命令🍋🟩
- 用户变量🍋🟩
- 定义用户变量
- 变量的引用🍋🟩
- 简单引用
- 花括号引用
- 命令替换
- 特殊字符处理🍋🟩
- 栗子🌰
- 案例1:定义变量A
- 案例3:声明静态的变量B=2,不能unset
- 案例4:将指令返回的结果赋给变量
- 变量定义规则🧾
🧐初识Shell
什么是Shell
Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。下面我们用一幅图来解释什么是
shell。
为什么要学习Shell🤔
- Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理
- 对于 JavaEE 和 Python 程序员来说,由于工作的需要,可能会要求你编写一些 Shell脚本来执行程序或者是完成对服务器的维护,比如编写一个定时备份数据库的脚本
- 对于大数据程序员来说,需要编写 Shell程序来管理集群
Shell脚本的编写要求和执行方式👏
脚本格式要求
- 脚本以 #!/bin/bash 开头
- 脚本具有可执行权限
脚本的常见执行方式
- 给要执行的脚本文件,添加可执行权限
- 直接用 sh脚本文件名 命令执行,不用赋予脚本可执行权限
第一个Shell脚本
[root@hygge ~] pwd /root [root@hygge ~] mkdir shellCode # 在root目录下面创建一个文件夹shellCode [root@hygge ~] cd shellCode/ [root@hygge shellCode] ll total 0 [root@hygge shellCode] vim hello.sh #创建一个脚本文件
保存并退出。
此时我们发现脚本是没有执行权限的[root@hygge shellCode] ll 总用量 4 -rw-r--r--. 1 root root 31 7月 16 11:40 hello.sh 当前脚本没有可执行权限 [root@hygge shellCode] ./hello.sh 执行脚本 -bash: ./hello.sh 权限不够
测试解决方案有两种:一种是修改脚本的可执行权限,第二种就是使用sh + 脚本文件名的方式执行脚本。
第一步:[root@hygge shellCode] chmod u+x hello.sh 给当前hello.sh赋予可执行权限 [root@hygge shellCode] ll 总用量 4 -rwxr--r--. 1 root root 31 7月 16 11:40 hello.sh 当前脚本具备可执行权限 [root@hygge shellCode] ./hello.sh 可以使用相对路径的方式执行shell脚本 Hello world [root@hygge shellCode] /root/shellCode/hello.sh 也可以使用绝对路径的方式执行shell脚本 Hello world
第二种:
我们先恢复脚本不可执行的权限[root@hygge shellCode] chmod u-x hello.sh 让hello.sh脚本不具备可执行的权限 [root@hygge shellCode] ll total 4 -rw-r--r--. 1 root root 31 Sep 5 20:51 hello.sh [root@hygge shellCode] sh hello.sh 执行脚本 Hello world
🥝Shell变量
系统变量+set命令🍋🟩
Linux中Shell的变量分为 系统变量 和 用户自定义变量。系统变量:$HOME 、 $PWD、 $SHELL、 $USER 等等。
我们可以使用set命令显示当前 Shell 中所有变量查询指定的系统变量:
[root@hygge shellCode] echo $HOME /root [root@hygge shellCode] echo $PWD /root/shellCode [root@hygge shellCode] echo $SHELL /bin/bash [root@hygge shellCode] echo $USER root
查询所有的系统变量:
[root@hygge shellCode] set | more
用户变量🍋🟩
定义用户变量
我们在开发中,绝大多数使用的是用户自定义的变量。呢么自定义变量该如何定义呢?
- 定义变量:变量=值 【注意:等号两侧没有空格】
- 撤销变量:unset 变量
- 声明静态变量:readonly 变量 【注意:该变量不能 unset 销毁 】
变量的引用🍋🟩
在 Shell 脚本中,要使用变量的值,需要在变量名前加上$符号。常见的引用方式有以下几种:
简单引用
直接在变量名前加$,如echo $name,这种方式最为常用
name="Bob" echo $name 输出:Bob
花括号引用
使用场景:当变量名和其他字符连接在一起时,可能导致解析错误,此时需要使用花括号将变量名括起来明确变量边界
fruit="apple" echo "I like ${fruit}s" 输出:I like apples
如果不使用花括号,写成echo “I like $fruits”,Shell 会尝试查找名为fruits的变量,而不是我们期望的fruit变量
命令替换
可以将命令的执行结果赋值给变量,使用反引号`或者$( )
current_date=`date +%Y-%m-%d` 使用反引号 echo $current_datecurrent_time=$(date +%H:%M:%S) 使用$( ) echo $current_time
$( )形式相对更常用,因为它更具可读性,并且在嵌套命令替换时更方便
特殊字符处理🍋🟩
当变量的值包含空格、特殊字符等时,需要使用引号进行处理。
- 双引号:双引号内的变量会被解析,特殊字符除了$、反斜杠\ 、反引号`外,其他都会保留原意
name="Alice" message="Hello, $name!" echo $message 输出:Hello, Alice!
- 单引号:单引号内的所有字符都会原样输出,变量不会被解析
message='Hello, $name!' echo $message 输出:Hello, $name!
- 反斜杠:反斜杠用于转义单个字符,使其失去特殊含义
path=/home/user\ documents echo $path 输出:/home/user documents
这里没有 反斜杠\ 的话会报错的,因为documents前面有一个空格,属于特殊字符,要用双引号括起来
栗子🌰
案例1:定义变量A
[root@hygge shellCode] vim vr.sh
结果:[root@hygge shellCode] chmod u+x vr.sh 设置脚本权限 [root@hygge shellCode] ./vr.sh 执行脚本 100
还可以这么输出:
结果:[root@hygge shellCode] ./vr.sh 100 A=100 A=100 A= 这里是因为变量A被销毁了,所以值不存在了
案例3:声明静态的变量B=2,不能unset
结果:[root@hygge shellCode]# ./vr.sh 100 A=100 A=100 A= B=2 ./vr.sh: 第 20 行:unset: B: 无法反设定: 只读 variable # 报错,无法销毁静态变量
案例4:将指令返回的结果赋给变量
结果是:
[root@hygge shellCode]# ./vr.sh 100 A=100 A=100 A= B=2 ./vr.sh: 第 20 行:unset: B: 无法反设定: 只读 variable 2025-07-16---12:05:58 2025-07-16---12:05:58
在上面的shell脚本里面,我们的变量都是大写,那么在shell编程里面,变量定义的规则是什么呢?
变量定义规则🧾
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头
- 等号两侧不能有空格
- 变量名称一般习惯为大写,这是一个规范,大家遵守即可
如果我的内容对你有帮助,请 点赞 , 评论 , 收藏 。创作不易,大家的支持就是我坚持下去的动力!