Shell 语法学习之条件判断:IF & CASE

2017/06/01

要想高效地使用 *nux,学会编写 shell 脚本是必要的(貌似会 python 也是一样的)。以往每次写脚本都是现找现用。不过私以为网上大多数总结都有些凌乱或是丑陋,所以打算开一个 “shell 语法学习”系列,作为自己学习 shell 语法的笔记,方便日后查阅。这里使用的是 bash

使用“语法学习”这个名字是因为个人觉得,虽说各种编程语言都有自己的特点,但它们的核心理念都是相似的。所以学习语言最基础也是最重要的,就是学习,熟悉和记忆语法。就和学习各种日常使用的语言一样,主要靠背 : )。当然了,还要培养语感,不过语感也就是在熟悉语言的过程中逐渐培养出来的罢了。当然了,不管是对编程语言,还是日常语言的学习,我都知之甚少,如果认为以上说的失之偏颇,欢迎留言指出。

这是“shell 语法学习笔记”系列的第一篇,条件判断,个人认为这是实现自动化的一个重要基础。

基本结构

一. IF 语句

if [ condition ](); then
  do action
elif [ condition ](); then
  do
else
  do action
fi

二. CASE 语句

结构比较单一,只支持一种条件判断式,不过我猜想它和 switch 一样,在情况较多时执行效率要比 if 高,此外,在这种情况下使用 case 来替代 if 也会让代码更为简洁易读。

case $var in
xx) action1;;
yy) action2;;
esac

如果想写的漂亮些就是

case $var in
  xx)
action1
;;
  yy)
action2
;;
  *)    # 表示剩余所有情况
wildcard_action
;;
esac

三. SELECT 语句

一个交互式菜单,让用户从不同的值中选择

select var in var1 var2 var3; do
  actions
done

逻辑操作符

分两种类型


以上两种类型使用的形式不同,举个例子:

[ condition1 ] && [ condition2 ] 以及 [ "condition1" -a "condition2" ] 都表示要同时满足 condition1condition2 返回值才为  true 

以下均只列出一些常用的操作符,完整列表请使用 man test 查看。

针对字符串的判断

操作符 什么情况下返回值为 true
-z string string 为空字符串
-n string string 为非空字符串
string1 = string2 两字符串相等
string1 != string2 两字符串不相等

针对整数的判断

操作符 什么情况下返回值为 true
int1 -eq int2 两数相等
int1 -ne int2 两数不相等
int1 -gt int2 int1 大于 int2
int1 -lt int2 int1 小于 int2
int1 -ge int2 int1 大于等于 int2
int1 -le int2 int1 小于等于 int2

针对文件的判断

文件类型

操作符 什么情况下返回值为 true
-e file file 存在(任意类型)
-d file file 存在且为目录
-f file file 存在且为普通文件
-L file file 存在且为符号链接文件(软链接)

文件权限

操作符 什么情况下返回值为 true
-r file file 可读
-w file file 可写
-x file file 可执行