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 函数。
page icon
注意:如果传入的参数多于 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. 使用 $# 检查参数个数


练习

notion image
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...