Shell 脚本

Shell语法完整进阶手册

Shell语法完整进阶手册(脚本编写+编译实操+符号大全+踩坑记录)

作者:洋柿子·2026-09-01·共 5 篇 · 当前 2

Shell语法完整进阶手册(脚本编写+编译实操+符号大全+踩坑记录)

一、Shell 语法总大纲

本章学习全部模块:

  1. 如何抒写一个 shell 脚本
  2. shell 脚本运行方式
  3. shell 中的特殊符号
  4. 管道
  5. 重定向
  6. shell 中数学运算
  7. 脚本退出

二、Shell 脚本核心概念

2.1 脚本定义

将完成一个任务的所有命令按照执行行权限。

2.2 脚本后缀规范

  • shell 脚本可以不写后缀名;
  • 但是为了人为辨析、可读性,建议加 .sh 后缀。

2.3 脚本头部解释器声明

#!/bin/zsh
#!/usr/bin/env bash

个人疑惑记录

写了 #!/bin/zsh 的脚本,依旧可以使用 bash xxx.sh 运行。

原理:头部#!仅给系统自动识别使用,手动指定解释器运行时,头部声明失效。

2.4 脚本标准化注释模板(个人规范)

#Author: Mike Qiu
#Creatd Time: 2022/7/28 14:36
#Release: 1.0
#Script Description: nginx install script

此类注释可由 Git 版本控制替代,属于手写脚本规范。

2.5 脚本权限控制(重点)

错误认知

权限设置为 777,等于权限系统作废,生产绝对禁止。

正确场景权限

vim nginx_install.sh
chmod 700 nginx_install.sh

700:仅所有者可读可写可执行,最安全的个人脚本权限。

2.6 脚本两种运行方式

# 方式1:赋予权限后直接运行
./nginx_install.sh
# 方式2:解释器直接调用,无需执行权限
zsh nginx_install.sh
bash nginx_install.sh

结论:解释器直接运行脚本,不需要执行权限。

三、Shell 特殊符号大全(个人汇总)

符号 作用说明
* 通配符,匹配任意字符
? 通配符,匹配单个字符
; 分隔多条命令,顺序执行
` `
\ 转义字符
```` 反引号,执行命令并接收返回值
'' 单引号,原样输出,不解析变量
"" 双引号,解析内部变量
$ 调取变量、特殊状态值

3.1 引号区别实操验证

echo '$USER'   # 原样输出$USER
echo "$USER"   # 解析输出当前用户名
echo ''$USER''

四、Shell 快捷操作符号(历史命令)

4.1 目录快捷符号

  • ~:家目录
  • -:上一次所在目录

4.2 历史命令快捷调用

  • !!:执行上一条命令
  • !p:匹配最近一条以p开头的命令(如pwd)
  • !索引:根据history索引执行指定命令

实操示例

history
!45

五、Shell 变量与返回值

5.1 自定义变量

赋值绝对不能加空格:

USER=mike

5.2 执行返回值

echo $?

作用:查看上一条命令是否执行成功(0为成功)。

六、Shell 数学运算

6.1 运算符号

  • 、- 、* 、/ 、% (加减乘除取余)

6.2 expr 运算命令

expr = evaluate expressions(执行表达式)

expr 3 \* 3

注意:* 在shell是通配符,必须使用反斜杠转义。

6.3 反引号命令嵌套

echo -n "Date is: ";date +%F
echo "Date is: `date +%F`"

七、Linux 包管理器对比(Yum / Pacman)

7.1 CentOS-Yum

yum -y install vim
yum -y install wget gcc pcre-devel zlib-devel

7.2 Arch-Pacman(本人本机)

sudo pacman -Syyu wget gcc pcre zlib
sudo pacman -S tar make sudo

7.3 静默安装(自动确认Y)

yes | pacman -Syu

7.4 个人核心思想

杜绝过度依赖包管理器;追求通用Linux编译方式,不用适配不同发行版命令。

编译安装适配所有Linux,pacman、dpkg属于发行版专属工具。

八、实操:Nginx 编译安装教程(两种方式)

8.1 传统wget下载编译

wget https://nginx.org/download/nginx-1.23.1.tar.gz
tar xf nginx-1.23.1.tar.gz
cd nginx-1.23.1
./configure --prefix=/usr/local
make -j 4    # 4线程加速编译
make install

8.2 httpie替代wget下载(新式写法)

yes | sudo pacman -Syyu httpie gcc pcre zlib
http https://nginx.org/download/nginx-1.23.1.tar.gz > nginx-1.23.1.tar.gz
tar xf nginx-1.23.1.tar.gz
cd nginx-1.23.1
./configure --prefix=/usr/local/nginx
sudo make -j 4
sudo make install

8.3 简单安装(官方包)

sudo pacman -S nginx

8.4 启动访问

sudo systemctl enable nginx
sudo systemctl start nginx

浏览器访问:http://localhost/

九、Httpie 安装详解(个人拓展)

9.1 Git源码编译

yes | sudo pacman -Syyu git
git clone https://github.com/httpie/httpie.git
cd httpie
./configure --prefix=/usr/local/httpie
sudo make -j 4
sudo make install

9.2 Pip快速安装(依赖Python)

pip install --upgrade httpie

9.3 依赖列表

python-charset-normalizer、python-defusedxml、python-multidict、python-pysocks、python-requests-toolbelt、httpie

9.4 个人评价

  • httpie 是 wget/curl 替代品;
  • 可定制GET请求,适合爬虫学习;
  • 内置setup.py,python生态工具。

十、Pacman 报错处理 & 进阶操作

10.1 数据库锁定报错

报错路径:/var/lib/pacman/db.lck

粗暴方式(不优雅)

sudo rm -rf /var/lib/pacman/db.lck

优雅排查方式

sudo pacman -S lsof
lsof /var/lib/pacman/db.lck

个人实验:本机无进程占用,无输出。

10.2 清理缓存

pacman -Sc

10.3 依赖树查询

命令:pactree

10.4 代理问题记录

pacman 代理加速仅读取 /etc/pacman.conf 内部服务器;系统全局代理对pacman无效,不走代理通道。

十一、远程桌面软件(教程实操软件)

11.1 软件名称

Remote Desktop Manager

11.2 版本区别

  • 免费版:remote-desktop-manager-free
  • 收费版:remote-desktop-manager

11.3 安装命令(AUR)

yay -S remote-desktop-manager-free

11.4 场景理解

教程使用VMware虚拟机远程连接;本人本机为ArchLinux,无需额外虚拟机。

主机、虚拟机处于同一路由网段,可互相通信。

十二、SELinux 安全机制(底层安全)

12.1 概念

SELinux:Security Enhanced Linux,Linux增强安全机制。

12.2 查看状态

十、Pacman 操作系统包管理器详解

10.1 Pacman 核心概念

Pacman (Package Manager):Arch Linux 的官方软件包管理器,用于安装、升级、卸载软件。

10.1.1 安装前提

sudo pacman -Syyu

10.1.2 基本操作命令

1. 更新系统

sudo pacman -Syu

2. 安装软件包

# 获取依赖并安装
sudo pacman -S <软件包名>

# 静默安装(自动输入 y)
yes | sudo pacman -S <软件包名>

3. 升级软件包

sudo pacman -Syu <软件包名>

4. 卸载软件包

sudo pacman -Rs <软件包名>  # -s 级联卸载依赖包
sudo pacman -Rn <软件包名>  # 仅卸载软件包,保留依赖

5. 搜索软件包

# 在系统中搜索已安装的包
sudo pacman -Qs <关键词>

# 查询某个包的安装状态
sudo pacman -Q <包名>
sudo pacman -Qne  # 显示未安装的依赖
sudo pacman -Rup  # 显示已安装的依赖

6. 查询软件信息

sudo pacman -Si <软件包名>  # 查询可安装包的信息
sudo pacman -Qi <软件包名>  # 查询已安装的包信息

7. 清理缓存

sudo pacman -Sc  # 清理下载缓存
sudo pacman -Scc # 重复命令,彻底清理

10.2 Pacman 常见问题处理

1. 数据库锁定错误

# 方法 1:找到占用进程
sudo pacman -S lsof
sudo lsof /var/lib/pacman/db.lck

# 方法 2:移除锁定文件
sudo rm -rf /var/lib/pacman/db.lck

2. 缺少依赖包

sudo pacman -Syyu <依赖包名>

3. 权限问题

sudo su

10.3 Pacman 高级参数

参数 说明
-S 软件包操作(安装/更新/移除)
-y 自动确认 yes 提示
-u 打补丁升级
-Sc 清理空子目录的缓存
-Scc 清理时选择要更新的软件包
-Qi 查询已安装包信息
-Si 搜索可安装包
-Qs 搜索系统中所有包

10.4 Pacman 配置文件

主配置文件:/etc/pacman.conf

[TARGET]
Server = https://mirror.tuna.tsinghua.edu.cn/archlinux/$arch core
Server = https://mirror.tuna.tsinghua.edu.cn/archlinux/$arch extra
PackageMirror = https://aur.archlinux.org
SigLevel = Optional
Include = /etc/pacman.d/mirrorlist

10.5 Pacman vs 其他包管理器

特性 Pacman Apt (Debian) Yum (Fedora)
系统 Arch Linux Debian/Ubuntu RHEL/CentOS
同步方式 直接同步 映像缓存 GPG 压缩镜像
安装速度 快 较慢 慢
推荐性 Arch 官方 Debian 官方 RHEL 官方

10.6 实践示例

实例 1:安装工具链

sudo pacman -Syyu gcc make git vim curl clang python

实例 2:安装编译依赖

sudo pacman -Sgcc pcre-devel zlib-devel openssl

实例 3:AUR 包安装

# 安装 yay 等 AUR 工具
sudo pacman -Sy yay
yay -S <AUR 包名>

核心要点

  1. Pacman 是 Arch Linux 的官方包管理器
  2. 必须配合 yyyu 同步源更新
  3. 清理缓存时使用 -Sc 命令
  4. 数据库锁定需先查进程再处理
  5. 卸载用 -Rs 级联,用 -Rn 保留依赖
getenforce

12.3 临时关闭防护

setenforce 0
systemctl stop firewalld
systemctl disable firewalld

12.4 Arch SELinux 部署

sudo pacman -S dbus openssh sudo
sudo systemctl enable sshd
sudo systemctl start sshd

12.5 AUR安全包

openssh-selinux:加固ssh远程连接安全。

12.6 个人理解

SELinux、sudo、pacman 本质都是权限收缩、安全管控;

Linux原生编译方式权限最干净、最底层。

12.7 自定义软件源(selinux源)

[selinux]
Server = https://github.com/archlinuxhardened/selinux/releases/download/ArchLinux-SELinux
SigLevel = Never

十三、个人总结 & 主观思考(原汁原味保留)

  1. Shell 竞争对手是 Python,Shell适合运维、底层、命令流;Python适合开发、爬虫、复杂逻辑。
  2. 编译安装通用性最强,避免不同发行版命令切换(yum、apt、pacman)。
  3. 脚本权限严格控制,禁止滥用777,生产必须最小权限原则。
  4. 解释器声明、引号区别、特殊符号是Shell硬性基础。
  5. pacman属于上层封装,编译安装最贴近Linux原生逻辑。
  6. 后期学习if判断语句,实现脚本防重复安装、自动检测环境。

十四、本次收录全部学习链接

  1. 视频教程:https://www.bilibili.com/video/BV1xB4y1v7qT?p=3
  2. RDM官网:https://blog.devolutions.net/2020/11/remote-desktop-manager-for-linux-now-available/
  3. AUR免费版:https://aur.archlinux.org/packages/remote-desktop-manager-free
  4. AUR收费版:https://aur.archlinux.org/packages/remote-desktop-manager
  5. Nginx下载:https://nginx.org/download/nginx-1.23.1.tar.gz
  6. Pacman yes问题:https://www.zhihu.com/question/443944861
  7. SELinux介绍:https://zhuanlan.zhihu.com/p/86813709
  8. Arch SELinux:https://wiki.archlinux.org/title/SELinux
  9. SELinux仓库:https://github.com/archlinuxhardened/selinux
  10. 下载工具对比:https://linux.cn/article-5479-1.html
  11. Nginx源码:https://github.com/nginx/nginx
  12. Pacman官方文档:https://wiki.archlinux.org/title/Pacman
  13. Httpie源码:https://github.com/httpie/httpie.git
  14. Pactree文档:https://linux.cn/article-13099-1.html