Linux 基础与 Shell 编程笔记

环境变量

  • PATH 环境变量:用于指定命令搜索路径,值为冒号分隔的目录列表。

  • 配置文件位置:

    • 系统级/etc/bashrc(或 /etc/bash.bashrc)、/etc/profile/etc/profile.d/*.sh
    • 用户级~/.bashrc~/.bash_profile(或 ~/.profile
  • 临时生效(仅当前终端):

    bash

    1
    export PATH="/usr/local/bin:$PATH"
  • 永久生效:将 export 语句写入上述配置文件后,执行 source ~/.bashrc(或重新登录)。

  • 查看变量值:

    bash

    1
    echo $PATH
  • 示例:将自定义路径添加到 PATH(以 zsh 为例)

    bash

    1
    2
    echo 'export PATH="/usr/local/scripts:$PATH"' >> ~/.zshrc
    source ~/.zshrc

目录操作

命令 说明
ls 列出目录内容(常用选项:-l 详细信息,-a 显示隐藏文件,-h 人类可读大小)
ll 许多系统别名 ls -l,显示详细信息
mkdir 创建目录(-p 递归创建父目录)
rm 删除文件或目录(-r 递归删除,-f 强制删除,谨慎使用)
cp 复制文件或目录(cp source destination-r 复制目录)
mv 移动/重命名文件或目录(mv source destination
pwd 显示当前工作目录的绝对路径
cd 切换目录(cd ~ 回到家目录,cd - 回到上一个目录)

文件操作

命令 说明
cat 查看文件内容(可与 grep 组合筛选:`cat server.log
tail 查看文件尾部(-n 20 显示最后20行,-f 实时跟踪新增内容)
head 查看文件头部(-n 10 显示前10行)
vim / vi 文本编辑器(按 i 进入编辑模式,Esc 退出编辑,:wq 保存退出,:q! 不保存退出)
less / more 分页查看大文件(/关键词 搜索,q 退出)
touch 创建空文件或更新文件时间戳
find 按条件查找文件(例如 find /home -name "*.txt"

压缩与打包

命令 说明
tar -zcvf archive.tar.gz file1 file2 创建 tar.gz 压缩包(z gzip,c 创建,v 显示过程,f 指定文件名)
tar -zxvf archive.tar.gz 解压 tar.gz 包(x 解压)
tar -jcvf archive.tar.bz2 file 创建 tar.bz2 压缩包(j bzip2)
tar -jxvf archive.tar.bz2 解压 tar.bz2 包
zip -r archive.zip folder 创建 zip 压缩包
unzip archive.zip 解压 zip 包
gzip file / gunzip file.gz 单独压缩/解压单个文件(不保留源文件)

文件传输

  • scp(基于 SSH 的安全复制):

    bash

    1
    2
    3
    scp local_file user@remote:/remote/path          # 上传
    scp user@remote:/remote/file local_path # 下载
    scp -r local_folder user@remote:/remote/path # 递归复制目录
  • rsync(高效同步,支持断点续传):

    bash

    1
    rsync -avz local_dir/ user@remote:/remote_dir/
  • ftp / sftp

    • 交互式命令:put(上传),get(下载),delete(删除),lscdbye(退出)
    • 推荐使用 sftp(SSH 文件传输协议,更安全)

文件权限

  • 权限表示(以 -rwxrwxr-- 为例):

    • 第一个字符:- 普通文件,d 目录,l 符号链接
    • 后面三组(每组 rwx):所有者、所属组、其他用户
    • 各权限数字:r=4w=2x=1,无权限=0
  • 修改权限

    bash

    1
    2
    3
    chmod 764 file.txt   # 所有者 rwx(7),组 rw(6),其他 r(4)
    chmod u+x script.sh # 为所有者添加执行权限
    chmod -R 755 folder # 递归修改目录权限
  • 修改所有者

    bash

    1
    2
    chown user:group file
    chown -R user:group folder

用户管理

命令 说明
useradd username 创建用户(-m 创建家目录,-s /bin/bash 指定 shell)
userdel username 删除用户(-r 同时删除家目录和邮件池)
usermod 修改用户信息(-aG group user 将用户添加到附加组,-L 锁定用户,-U 解锁)
passwd username 设置或修改用户密码
su - username 切换用户(- 表示同时切换环境变量)
sudo command 以管理员权限执行命令(需要用户已在 /etc/sudoers 中配置)
groupadd groupname 创建用户组
groupmod -n newname oldname 修改组名
groupdel groupname 删除用户组
id username 查看用户的 UID、GID 和所属组

系统状态

命令 说明
top 动态查看进程及资源占用(按 P 按 CPU 排序,M 按内存排序,q 退出)
htop 增强版 top(需要安装),界面更友好
ps aux 静态查看所有进程(aux 显示详细格式)
ps -ef 另一种进程查看格式
kill -9 PID 强制终止进程(-9 SIGKILL,-15 SIGTERM 友好终止)
pkill process_name 按名称终止进程
free -h 查看内存使用情况(-h 人类可读)
df -h 查看磁盘分区使用情况
du -sh folder 查看目录总大小(-s 汇总,-h 可读)
uptime 查看系统运行时间、负载
uname -a 查看系统内核版本和架构

网络

命令 说明
ip addr / ifconfig 查看网络接口信息(IP、MAC、状态)
ip link set eth0 up/down 启用/禁用网卡
netstat -tuln 查看监听端口(-t TCP,-u UDP,-l 监听,-n 不解析名称)
ss -tuln 现代替代 netstat,速度更快
ping -c 4 google.com 测试网络连通性(-c 指定次数)
telnet host port 测试端口是否开放(例如 telnet 192.168.1.1 80
curl -O http://example.com/file 下载文件,支持多种协议(HTTP/HTTPS/FTP)
curl -I http://example.com 只获取 HTTP 头部
wget -c http://example.com/file 下载工具(-c 断点续传)
traceroute google.com 跟踪路由路径(mtr 是增强版)
host domain.com / nslookup domain.com DNS 查询
iptables -L 查看防火墙规则(-n 不解析,-v 详细)
ufw status Ubuntu 简易防火墙状态(enable/disable 启用/禁用)

Shell 编程

Shell 脚本是 Linux 下实现任务自动化的主要方式,最常用的 Shell 为 Bash

1. 脚本开头

bash

1
#!/bin/bash          # 指定解释器路径

2. 变量

bash

1
2
3
4
name="John"          # 等号两边不能有空格
echo $name # 使用变量加 $
readonly age=25 # 只读变量
unset name # 删除变量

3. 特殊变量

变量 含义
$0 脚本名称
$1 ~ $9 第 1~9 个参数
$# 参数个数
$@ 所有参数(每个视为独立字符串)
$* 所有参数(视为一个整体字符串)
$? 上一条命令的退出状态(0 表示成功)
$$ 当前脚本的进程 ID

4. 数组

bash

1
2
3
4
arr=(a b c)
echo ${arr[0]} # a
echo ${arr[@]} # 所有元素
echo ${#arr[@]} # 元素个数

5. 条件判断

bash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 文件测试
if [ -f "file.txt" ]; then
echo "是普通文件"
fi

# 数值比较
if [ $a -eq $b ]; then # -eq, -ne, -gt, -lt, -ge, -le
echo "相等"
fi

# 字符串比较
if [ "$str1" = "$str2" ]; then
echo "相同"
fi

# 逻辑运算
if [ $a -gt 5 ] && [ $a -lt 10 ]; then
echo "a 在 6~9 之间"
fi

常用文件测试操作符:

选项 含义
-e 文件存在
-f 是普通文件
-d 是目录
-r / -w / -x 可读/可写/可执行

6. 循环

bash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# for 循环(列表)
for i in {1..5}; do
echo $i
done

# for 循环(类 C)
for ((i=0; i<5; i++)); do
echo $i
done

# while 循环
count=1
while [ $count -le 3 ]; do
echo $count
((count++))
done

# 遍历文件
for file in *.txt; do
echo $file
done

7. 函数

bash

1
2
3
4
5
6
7
function say_hello() {
echo "Hello, $1" # $1 是第一个参数
return 0
}

say_hello "World"
echo "返回值: $?"

8. 输入输出重定向

符号 说明
> 覆盖输出到文件
>> 追加输出到文件
2> 重定向错误输出
&> 同时重定向标准输出和错误
< 从文件读取输入
` `

9. 常用示例

逐行读取文件

bash

1
2
3
while IFS= read -r line; do
echo "$line"
done < input.txt

检查命令是否存在

bash

1
2
3
4
5
if command -v curl &> /dev/null; then
echo "curl 已安装"
else
echo "curl 未安装"
fi

脚本中获取脚本所在目录

bash

1
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

10. 调试技巧

  • bash -x script.sh 执行脚本并显示每一条执行的命令
  • 脚本内部使用 set -x 开启调试,set +x 关闭调试

提示:以上命令和用法在绝大多数 Linux 发行版(CentOS、Ubuntu、Debian 等)及 macOS 上通用。实际使用时建议通过 man command 查看详细文档。