Shell 脚本条件判断
type
status
date
slug
summary
tags
category
icon
password
一、条件判断的类型
- if 条件判断:用于多条件、范围判断。
- case 条件判断:用于等值匹配,语法更简洁。
二、if 条件判断语法
1. 基本语法结构
单分支 if
双分支 if
多分支 if(elif)
2. 条件的写法
2.1 数字比较
表达式 | 含义 |
[ $a -eq $b ] | 等于 |
[ $a -ne $b ] | 不等于 |
[ $a -gt $b ] | 大于 |
[ $a -lt $b ] | 小于 |
[ $a -ge $b ] | 大于等于 |
[ $a -le $b ] | 小于等于 |
2.2 字符串比较
表达式 | 含义 |
[ "$str1" == "$str2" ] | 字符串相等 |
[ "$str1" != "$str2" ] | 字符串不等 |
[ -z "$str" ] | 字符串为空 |
[ -n "$str" ] | 字符串非空 |
⚠️ 字符串比较建议总是用双引号包裹变量,避免空值错误。
2.3 文件判断
表达式 | 含义 |
[ -e file ] | 文件是否存在 |
[ -f file ] | 是否为普通文件 |
[ -d file ] | 是否为目录 |
[ -r file ] | 是否可读 |
[ -w file ] | 是否可写 |
[ -x file ] | 是否可执行 |
3. 多条件组合
使用 a(and)和 o(or)
使用 && 和 ||
✅ 推荐使用 && 和 ||,更清晰且避免歧义。
三、case 条件判断
一、语法结构
示例:判断操作系统类型
二、位置定位
假设执行
./test.sh a b c 这样一个命令,则可以使用下面的参数来获取一些值:$0对应 ./test.sh 这个值。如果执行的是./work/test.sh, 则对应 ./work/test.sh 这个值,而不是只返回文件名本身的部分。
$1会获取到 a,即$1对应传给脚本的第一个参数。
$2会获取到 b,即$2对应传给脚本的第二个参数。
$3会获取到 c,即$3对应传给脚本的第三个参数。$4、$5等参数的含义依此类推。
$#会获取到 3,对应传入脚本的参数个数,统计的参数不包括$0。
$@会获取到 "a" "b" "c",也就是所有参数的列表,不包括$0。
$*也会获取到 "a" "b" "c", 其值和$@相同。但"$*"和"$@"有所不同。"$*"把所有参数合并成一个字符串,而"$@"会得到一个字符串参数数组。
$?可以获取到执行./test.sh a b c命令后的返回值。 在执行一个前台命令后,可以立即用$?获取到该命令的返回值。 该命令可以是系统自身的命令,可以是 shell 脚本,也可以是自定义的 bash 函数。
注意:如果传入的参数多于 9 个,则不能使用
$10 来引用第 10 个参数,而是要用 ${10} 来引用。即,需要用大括号
{}把大于 9 的数字括起来。例如,
${10} 表示获取第 10 个参数的值,写为 $10 获取不到第 10 个参数的值。实际上,
$10 相当于 ${1}0,也就是先获取 $1 的值,后面再跟上 0。如果
$1 的值是 "first",则 $10 的值是 "first0"。四、常见错误与修正
错误1:变量未引号导致空值错误
错误2:命令替换语法错误
错误3:grep 空行判断
五、补充知识点
1. 使用 [[ ]] 代替 [ ]
[[ ]]是 Shell 关键字,支持更强大的表达式(如正则匹配)。
- 例如:
[[ "$str" =~ ^[0-9]+$ ]]
2. 使用 set -e 让脚本遇到错误立即退出
3. 使用 read -p 提示用户输入
4. 使用 $# 检查参数个数
练习

awk 是一种处理文本文件的语言,是一个强大的文本分析工具。选项参数说明:
options:是一些选项,用于控制awk的行为。
pattern:是用于匹配输入数据的模式。如果省略,则awk将对所有行进行操作。
{action}:是在匹配到模式的行上执行的动作。如果省略,则默认动作是打印整行。options 参数说明:
F <分隔符>或-field-separator=<分隔符>: 指定输入字段的分隔符,默认是空格。使用这个选项可以指定不同于默认分隔符的字段分隔符。
v <变量名>=<值>: 设置awk内部的变量值。可以使用该选项将外部值传递给awk脚本中的变量。
f <脚本文件>: 指定一个包含awk脚本的文件。这样可以在文件中编写较大的awk脚本,然后通过f选项将其加载。
V或-version: 显示awk的版本信息。
h或-help: 显示awk的帮助信息,包括选项和用法示例。
cut命令用于显示每行从开头算起 num1 到 num2 的文字参数:
- -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
- -c :以字符为单位进行分割。
- -d :自定义分隔符,默认为制表符。
- -f :与-d一起使用,指定显示哪个区域。
- -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除
tr 命令用于转换或删除文件中的字符。参数说明:
- -c, --complement:反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换
- d, --delete:删除指令字符
- -s, --squeeze-repeats:缩减连续重复的字符成指定的单个字符
- -t, --truncate-set1:削减 SET1 指定范围,使之与 SET2 设定长度相等
- --help:显示程序用法信息
- --version:显示程序本身的版本信息
字符集合的范围:
- \NNN 八进制值的字符 NNN (1 to 3 为八进制值的字符)
- \\ 反斜杠
- \a Ctrl-G 铃声
- \b Ctrl-H 退格符
- \f Ctrl-L 走行换页
- \n Ctrl-J 新行
- \r Ctrl-M 回车
- \t Ctrl-I tab键
- \v Ctrl-X 水平制表符
- CHAR1-CHAR2 :字符范围从 CHAR1 到 CHAR2 的指定,范围的指定以 ASCII 码的次序为基础,只能由小到大,不能由大到小。
- [CHAR*] :这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止
- [CHAR*REPEAT] :这也是 SET2 专用的设定,功能是重复指定的字符到设定的 REPEAT 次数为止(REPEAT 的数字采 8 进位制计算,以 0 为开始)
- [:alnum:] :所有字母字符与数字
- [:alpha:] :所有字母字符
- [:blank:] :所有水平空格
- [:cntrl:] :所有控制字符
- [:digit:] :所有数字
- [:graph:] :所有可打印的字符(不包含空格符)
- [:lower:] :所有小写字母
- [:print:] :所有可打印的字符(包含空格符)
- [:punct:] :所有标点字符
- [:space:] :所有水平与垂直空格符
- [:upper:] :所有大写字母
- [:xdigit:] :所有 16 进位制的数字
- [=CHAR=] :所有符合指定的字符(等号里的 CHAR,代表你可自订的字符)
ss 是 Linux 中用于查看套接字统计信息的命令,功能类似于 netstat,但速度更快,提供更详细的网络连接状态信息。options 参数说明:
a, --all:显示所有的套接字,包括监听和非监听的。
t, --tcp:仅显示 TCP 套接字。
u, --udp:仅显示 UDP 套接字。
l, --listening:仅显示监听状态的套接字。
p, --processes:显示与套接字关联的进程信息。
n, --numeric:以数字形式显示地址,而不是解析成主机名。
r, --resolve:将主机名解析为 IP 地址。
s, --summary:显示套接字的摘要信息。
4:仅显示 IPv4 套接字。
6:仅显示 IPv6 套接字。
i, --info:显示详细的内部信息。
o, --options:显示 TCP 计时器信息。
K, --kill:通过 ID 杀死指定的 socket。
f, --family=FAMILY:指定协议族(如inet,inet6,unix,link)。
m, --memory:显示每个套接字使用的内存。
H, --no-header:不显示标题行。
v, --verbose:显示详细的输出。
Loading...