“.sh”文件

在Linux中,.sh文件是Shell脚本文件。本质上是一个包含一系列Linux命令的纯文本文件,用于自动化执行任务

基本概念:

  • 扩展名含义:.sh表示"Shell"(命令行解释器)
  • 文件性质:纯文本文件,可以用任何文本编辑器(vi、nano、gedit等)打开
  • 作用:将多个命令按顺序写入一个文件,批量执行,避免重复手动输入
  • Shebang 必须写在第一行 :如#!/bin/bash 告诉系统用哪个shell解释

注意:

  • .bashrc配置文件,每次打开终端自动执行

  • .sh 文件是脚本文件,手动按需执行

不过它们本质上都是shell命令的集合,只是用法和触发方式不同

新建一个脚本文件:

bash 复制代码
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ touch test1.sh
bash 复制代码
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ ls
test1.sh
bash 复制代码
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ vim ./test1.sh
#!/bin/bash
## 注意:上面这一行不是注释!它是脚本中的一个特殊标记,叫做Shebang(或称解释器指令)
# 其中,"#!"是一个特殊标记,"/bin/bash"是Bash shell的路径。系统看到这个特殊标记后就要用/bin/bash这个程序来执行这个脚本

echo "Hello World!"
echo "2026/4/17 16:08"

按ESC键回到Vim的普通模式,输入":wq"保存并退出

bash 复制代码
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ ls -l
total 4
-rw-rw-r-- 1 xiaoyu xiaoyu 346 Apr 17 16:08 test1.sh
bash 复制代码
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ ./test1.sh
-bash: ./test1.sh: Permission denied
bash 复制代码
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ bash ./test1.sh
Hello World!
2026/4/17 16:08
对比项 ./test1.sh bash test1.sh
是否需要执行权限 ✅ 必须 (chmod +x) ❌ 不需要
依赖 Shebang ✅ 需要 (#!/bin/bash) ❌ 忽略 Shebang
指定解释器 由 Shebang 决定 强制使用 bash
工作原理 作为独立程序执行 将脚本作为参数传给 bash
可移植性 低(依赖 Shebang 路径) 高(明确使用 bash)

执行.sh脚本文件的方法1:作为可执行程序运行(最常用)

需要两步:

bash 复制代码
# 1. 给文件添加执行权限
chmod +x myscript.sh

# 2. 执行(需要指定路径)
./test1.sh          # 当前目录
/home/xiaoyu/LearnTests/test1.sh   # 绝对路径

方法2:用bash命令执行(不需要执行权限)

bash 复制代码
bash test1.sh
# 或
sh test1.sh

方法3:使用source命令执行(在当前shell中)

bash 复制代码
source myscript.sh
# 或
. myscript.sh

三种执行方式的区别:

方式 执行权限要求 运行环境 环境变量是否保留(如果脚本中有) 典型用途
./script.sh 需要 chmod +x 子shell ❌ 不保留 普通脚本
bash script.sh 不需要 子shell ❌ 不保留 快速测试
source script.sh 不需要 当前shell ✅ 会保留 加载配置

第二个示例:

bash 复制代码
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ touch test2.sh
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ ls
test1.sh  test2.sh
bash 复制代码
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ vim test2.sh
# 没有指明Shebang,即Shebeng被忽略
echo "2026/4/17 16:35"
bash 复制代码
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ test2.sh
test2.sh: command not found
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ ./test2.sh
-bash: ./test2.sh: Permission denied

第一次失败:command not found

表明系统在PATH环境变量中找不到test2.sh这个命令

第二次失败:Permission denied

表明文件存在且路径正确,但是没有执行权限

失败原因分析:

第一次失败中,你直接输入test2.sh,没有指定路径。那么系统会在PATH环境变量定义的目录中查找这个命令,但是当前目录(~/LearnTests)不在PATH环境变量中,因此系统找不到test2.sh这个命令

推荐的解决方法:指定路径(就像第二次失败的指令一样,虽然说第二次也失败了)

第二次失败中,test2.sh文件没有执行权限(x权限)

验证test2.sh的权限:

bash 复制代码
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ ls -l ./test2.sh
-rw-rw-r-- 1 xiaoyu xiaoyu 67 Apr 17 16:36 ./test2.sh

解决方法:添加权限

bash 复制代码
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ chmod +x test2.sh
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ ls -l test2.sh
-rwxrwxr-x 1 xiaoyu xiaoyu 67 Apr 17 16:36 test2.sh
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ ./ test2.sh
-bash: ./: Is a directory
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ ./test2.sh
2026/4/17 16:35

第三个示例:

bash 复制代码
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ vim test3.sh
# 没有指明Shebang,即Shebeng被忽略
echo "2026/4/17 16:35"
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ test3.sh
test3.sh: command not found
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ test2.sh
test2.sh: command not found
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ ./test3.sh
-bash: ./test3.sh: Permission denied
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ bash test3.sh
2026/4/17 16:52

使用bash命令可以不用权限就执行.sh脚本文件

bash 复制代码
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ vim myscript.py
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ ./myscript.py
-bash: ./myscript.py: Permission denied
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ bash myscript.py
myscript.py: line 2: syntax error near unexpected token `"This is Python3"'
myscript.py: line 2: `print("This is Python3")'
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ ls -l myscript.py
-rw-rw-r-- 1 xiaoyu xiaoyu 44 Apr 17 16:58 myscript.py
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ chmod -x myscript.py
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ ls -l myscript.py
-rw-rw-r-- 1 xiaoyu xiaoyu 44 Apr 17 16:58 myscript.py

先分析一下上述输入输出:

使用vim编辑器创建了一个新的python文件:myscript.py

我在myscript.py中输入了:

bash 复制代码
#!/usr/bin/python3
print("This is Python3")

然后输入:./myscript.py想把这个文件当成可执行文件执行,但是输出表示没有权限

然后我使用bash命令,即用bash解释器去执行Python代码,但是bash不认识Python的print()语法,所以报语法错误

然后我使用ls命令查看了myscript.py的权限,知道了这个文件没有x权限,所以不能被当作可执行文件一样被执行

于是我想给它添加权限,但是我命令输错了!-x的意思是:移除执行权限

bash 复制代码
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ chmod +x myscript.py
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ ls -l myscript.py
-rwxrwxr-x 1 xiaoyu xiaoyu 44 Apr 17 16:58 myscript.py
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ ./myscript.py
This is Python3

或用Python解释器直接运行:

bash 复制代码
xiaoyu@xiaoyu-VMware-Virtual-Platform:~/LearnTests$ python3 myscript.py
This is Python3
相关推荐
斯班奇的好朋友阿法法3 小时前
中科方德(NFSChina)离线安装 RPM 包
运维
milo.qu4 小时前
RockyLinux9.7 docker部署Jisti Meet
linux·docker·容器
GanGanGanGan_4 小时前
CentOS 7.9 glibc 2.17 源码编译升级到 glibc 2.31
linux·运维·centos·glibc
charlie1145141914 小时前
嵌入式Linux驱动开发——class 和 device 模型 - 自动创建设备节点的幕后机制
linux·运维·驱动开发
杨云龙UP6 小时前
SQL Server2022部署:Windows Server 2016下安装、SSMS配置、备份还原与1433端口放通全流程_20260508
运维·服务器·数据库·sql·sqlserver·2022
梦想与想象-广州大智汇6 小时前
自建docker加速镜像,使用 Cloudflare Workers/Pages 部署加速教程
运维·docker·容器
枳实-叶6 小时前
【Linux驱动开发】第四天:dmesg日志全解+驱动加载失败极速排查
linux·运维·驱动开发
武超杰7 小时前
Nginx从入门到精通
运维·nginx
wdfk_prog7 小时前
正常关闭虚拟机时,不要点“关机”,而要点“关闭客户机”
linux·c语言·网络·ide·vscode
weixin_704266057 小时前
Nginx 反向代理 + 6 种负载均衡策略
运维·nginx