Shell Conditional Test

在 shell 脚本判断逻辑中的一些操作符 一、字符串测试 选项 含义 示例 说明 -z 字符串为空 [ -z "$str" ] 变量未定义或值为空时为真 -n 字符串非空 [ -n "$str" ] 变量已定义且值不为空时为真 重要提示:变量必须用双引号包裹,避免未定义变量导致语法错误: # 错误写法(未定义变量会报错) [ -n $var ] # 正确写法 [ -n "$var" ] 二、文件测试 文件存在性测试 选项 含义 示例 -e 文件/目录存在 [ -e "/path" ] -a 同 -e(已废弃) 不推荐使用 文件类型测试 选项 含义 示例 -f 常规文件 [ -f file.txt ] -d 目录 [ -d "/dir" ] -L 符号链接 [ -L link ] -h 同 -L [ -h link ] -b 块设备 [ -b /dev/sda ] -c 字符设备 [ -c /dev/tty ] -p 命名管道 [ -p pipe ] -S 套接字 [ -S socket ] 权限测试 选项 含义 示例 -r 可读 [ -r file ] -w 可写 [ -w file ] -x 可执行 [ -x script.sh ] -g 设置了 setgid [ -g file ] -u 设置了 setuid [ -u file ] -k 设置了 sticky bit [ -k /tmp ] 文件属性测试 选项 含义 示例 -s 文件非空 [ -s data.log ] -N 修改后未读取 [ -N file ] -O 当前用户拥有 [ -O file ] -G 当前用户组拥有 [ -G file ] 文件比较测试 选项 含义 示例 -nt 文件1比文件2新 [ file1 -nt file2 ] -ot 文件1比文件2旧 [ file1 -ot file2 ] -ef 相同设备/Inode [ file1 -ef file2 ] 三、数值比较 选项 含义 示例 等价算术符 -eq 等于 [ $a -eq 5 ] == -ne 不等于 [ $a -ne 5 ] != -gt 大于 [ $a -gt 5 ] > -ge 大于等于 [ $a -ge 5 ] >= -lt 小于 [ $a -lt 5 ] < -le 小于等于 [ $a -le 5 ] <= 四、组合逻辑 选项 含义 示例 ! 逻辑非 [ ! -f file ] -a 逻辑与 [ -f file -a -r file ] -o 逻辑或 [ -d dir -o -L dir ] 现代写法(推荐): ...

July 1, 2025 · 2 min · Theme PaperMod

iptables

图片引用 https://mp.weixin.qq.com/s/GTAGMy2t0FIIUhq6CpFgWw 🧩 一、iptables 五表详解 优先级顺序 raw > mangle > nat > filter > security 表名 用途 作用时机 优先级 常用规则 raw 关闭连接跟踪(conntrack) 最早阶段 ⭐最高 NOTRACK mangle 修改数据包(TTL、TOS、MARK等) 早期、中期、晚期都可插入 高 MARK, TTL, TOS nat 实现源地址或目标地址转换(NAT) PREROUTING / POSTROUTING / OUTPUT 中 SNAT, DNAT, MASQUERADE filter 数据包过滤(放行/丢弃) 处理末期 ⭐最常用 ACCEPT, DROP security 与 SELinux、AppArmor 结合的强制访问控制 最后阶段 低 配合 SELinux 使用 🔗 二、五链详解(对应五个 hook 点) 链名 描述 属于哪些表 PREROUTING 入站包一进内核就处理(在路由前) raw, mangle, nat INPUT 进入本机的包 mangle, filter, security FORWARD 转发到别处的包 mangle, filter, security OUTPUT 本机发出的包 raw, mangle, nat, filter, security POSTROUTING 所有出站包(包括转发)在离开前 mangle, nat, security 🚚 三、收发包流程图说明(图下方) 你贴的图,和 Netfilter 的真实流程图是基本一致的。下面我对照图帮你拆解下: ...

June 26, 2025 · 2 min · Theme PaperMod

Shell 脚本中为何使用 `{ ... }` 包裹整个脚本

📌 问题 在一些 Shell 脚本中,常常看到以下结构: #!/usr/bin/env bash { # this ensures the entire script is downloaded # # 脚本内容 some_function() { echo "Hello" } some_function } # this ensures the entire script is downloaded # 为什么要用 { ... } 把整个脚本包裹起来?这样做有什么好处? ✅ 答案 这是一个 Shell 脚本技巧,主要用于: 确保整个脚本在下载完成并被完全解析之后再执行 🧠 原因解释 在执行远程脚本时,例如: curl -s https://example.com/script.sh | bash 脚本是以流式方式传给 bash 的,会出现: 边下载边执行 如果下载中断,脚本会只执行了一部分 函数定义、变量赋值可能不完整,甚至执行危险命令 🛡 加上 { ... } 的作用 使用大括号包裹: { # 所有脚本内容 } 等于告诉 bash: ...

June 11, 2025 · 1 min · Theme PaperMod