Shell编程(二)-分支结构

342 阅读2分钟

这是我参与更文挑战的第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