Shell语法完整进阶手册
Shell语法完整进阶手册(脚本编写+编译实操+符号大全+踩坑记录)
Shell语法完整进阶手册(脚本编写+编译实操+符号大全+踩坑记录)
一、Shell 语法总大纲
本章学习全部模块:
- 如何抒写一个 shell 脚本
- shell 脚本运行方式
- shell 中的特殊符号
- 管道
- 重定向
- shell 中数学运算
- 脚本退出
二、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 包名>
核心要点
- Pacman 是 Arch Linux 的官方包管理器
- 必须配合 yyyu 同步源更新
- 清理缓存时使用 -Sc 命令
- 数据库锁定需先查进程再处理
- 卸载用 -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
十三、个人总结 & 主观思考(原汁原味保留)
- Shell 竞争对手是 Python,Shell适合运维、底层、命令流;Python适合开发、爬虫、复杂逻辑。
- 编译安装通用性最强,避免不同发行版命令切换(yum、apt、pacman)。
- 脚本权限严格控制,禁止滥用777,生产必须最小权限原则。
- 解释器声明、引号区别、特殊符号是Shell硬性基础。
- pacman属于上层封装,编译安装最贴近Linux原生逻辑。
- 后期学习if判断语句,实现脚本防重复安装、自动检测环境。
十四、本次收录全部学习链接
- 视频教程:https://www.bilibili.com/video/BV1xB4y1v7qT?p=3
- RDM官网:https://blog.devolutions.net/2020/11/remote-desktop-manager-for-linux-now-available/
- AUR免费版:https://aur.archlinux.org/packages/remote-desktop-manager-free
- AUR收费版:https://aur.archlinux.org/packages/remote-desktop-manager
- Nginx下载:https://nginx.org/download/nginx-1.23.1.tar.gz
- Pacman yes问题:https://www.zhihu.com/question/443944861
- SELinux介绍:https://zhuanlan.zhihu.com/p/86813709
- Arch SELinux:https://wiki.archlinux.org/title/SELinux
- SELinux仓库:https://github.com/archlinuxhardened/selinux
- 下载工具对比:https://linux.cn/article-5479-1.html
- Nginx源码:https://github.com/nginx/nginx
- Pacman官方文档:https://wiki.archlinux.org/title/Pacman
- Httpie源码:https://github.com/httpie/httpie.git
- Pactree文档:https://linux.cn/article-13099-1.html