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

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