这是我参与更文挑战的第7天,活动详情查看:更文挑战
分支结构
test 命令
test 命令用于 对条件进行判断
-
不产生标准输出,必须通过其返回值判断结果
-
可对整数、字符串以及文件进行判断
-
表达式为真 返回 0(TRUE)
-
假 1 (FALSE)
test expression
# 或者
[ expression ] # []和expression之间必须有空格
- [ ]和expression之间必须有空格
1. 整数
| 运算符 | 语义 |
|---|---|
| -lt | 小于(<) |
| -le | 小于或等于(<=) |
| -gt | 大于(>) |
| -ge | 大于或等于(>=) |
| -eq | 等于(==) |
| -ne | 不等于(!=) |
演示
[root@localhost sh]# test 3 -lt 4
[root@localhost sh]# echo $? # 返回上次判断结果
0
[root@localhost sh]# [ 3 -gt 4 ]
[root@localhost sh]# echo $?
1
2.字符串
| 运算符 | 语义 |
|---|---|
| = | 等于 |
| != | 不等于 |
[root@localhost sh]# a=ff
[root@localhost sh]# c=ff
[root@localhost sh]# test $a=$c
[root@localhost sh]# echo $?
0
3.文件
| 运算符 | 语义 |
|---|---|
| -f | 如果文件存在且是普通文件(不是目录或设备)为真 |
| -s | 文件存在且字节数大于0 为真 |
| -r | 文件存在且可读 为真 |
| -w | 文件存在且可写 为真 |
| -x | 文件存在且可执行 为真 |
| -d | 目录存在且是个目录 为真 |
4.其他
| 运算符 | 语义 |
|---|---|
| -a | 逻辑与 |
| -o | 逻辑或 |
| ! | 逻辑非 |
| \( \) | 分组括号 必须使用\( 和\) 且和表达式之间必须有空格 |
if 语句
if/then/fi 都是独立的语句,若放在一行需要用分号分隔
if [ expression ];then
Todo
elif [ expression ];then
Todo
else
Todo
fi # 结束
单分支
#!/bin/sh
read filename # 输入文件名
if [ -d $filename ];then
echo "is dir"
fi
exit 0
双分支
#!/bin/sh
read filename
if [ -d $filename ]
then echo $filename "is a directory"
else
echo $filename "is't a DIRECTOR"
fi
exit 0
多分支
#!/bin/sh
read filename # 输入一个文件名
if [ -d $filename ];then # 判断是不是存在的目录
ls $filename # 输出目录
elif [ -x $filename ] # 判断是不是可执行文件
then echo "is"
else
echo "not is"
fi
exit 0
输入一个目录,输出这个目录中的文件
select 语句
select语句可以将选项列表做出类似目录的形式,以交互的方式选择列表的数据,传入select主体部分进行使用
select 变量 in 列表
do
…
[break]
done
- select语句实质上也是一个循环语句,若不添加break关键字,程序将无法跳出select结构
- 列表元素之间用空格分隔
实例
选择想要学习的课程
#!/bin/sh
echo "what do you want tu study?"
select sub in "Java" "C++" "WEB" # 列表元素空格 分隔
do
echo "you have selected $sub" # 使用 sub
break # 跳出循环
done
exit 0
如果不加 break 将不会跳出循环
case 语句
case语句可以将一个变量的内容与多个选项进行匹配,若匹配成功,则执行该条件下对应的语句。
case 变量 in
选项1) …;;
'选项2') …;;
"选项3") …;;
…
*) …
esac # 结束
case语句的匹配条件可以是多个,每个匹配项的多个条件使用“|”符连接
实例
#!/bin/sh
echo -e "a:\c"
read a
echo -e "b\c"
read b
echo -e "select(+ - * /):\c"
read var
case $var in
+) echo "a+b="`expr $a + $b`;;
-) echo "a+b="`expr $a - $b`;;
*) echo "a+b="`expr $a * $b`;;
/) echo "a+b="`expr $a / $b`;;
*) echo "error"
esac
exit 0
[root@localhost sh]# sh case.sh
a:2
b3
select(+ - * /):+
a+b=5
多条件- 判断输入的值是 true /false
#!/bin/sh
read var
case $var in
yes|y|Y) echo "true";; # 多个条件
no|n|N) echo "false";;
*) echo "input error";;
esac
exit 0
[root@localhost sh]# sh case_isYN.sh
y
true
[root@localhost sh]# sh case_isYN.sh
sdcsd
input error