条件语句
- 一、条件测试
- 1.1 测试命令
- 1.1 文件测试
- 1.2 整数比较
- 1.3 字符串比较
- 1.4 逻辑测试
- 1.4.1 逻辑与 &&
- 1.4.2 逻辑或 ||
 
- 1.4.3 组合应用
- 1.5 多个命令组合执行 ( ) { }
 
- 二、if语句
- 2.1单分支结构
- 2.2 多分支结构
- 2.4 if语句练习
- 2.4.1 单分支
- 2.4.2 简单的交互式分数反馈
 
 
- 三、case语句
- 3.1 case语句结构
- 3.2 case语句练习
 
- 四、echo命令详解
一、条件测试
1.1 测试命令
格式1:test 条件表达式
 格式2:[ 条件表达式 ]
test命令和 [    ] 相同,建议使用[   ] 
#方框中要空格
#用test可能会不小心定义变量 
1.1 文件测试
| 常见的测试操作符 | 含义 | 
|---|---|
| -d | 测试是否为目录(directory) | 
| -f | 测试是否为文件(File) | 
| -L | 测试是否为软连接文件 | 
| -r | 测试当前用户是否有读取权限(Read) | 
| -w | 测试当前用户是否有写入权限(Write) | 
| -x | 测试当前用户是否有执行权限(eXcute) | 
| -e | 测试目录或文件是否存在(Exist) | 
| 属性测试 | |
|---|---|
| -s FILE | 是否存在且非空 | 
| -t fd | 文件描述符是否在某终端已经打开 | 
| -N FILE | 文件自从上一次被读取之后是否被修改过 | 
| -O FILE | 当前有效用户是否为文件属主 | 
| -G FILE | 当前有效用户是否为文件属组 | 
示例一:测试文件类型
- 目录文件 -d
  
- 普通文件 -f
  
- 软连接文件 -L
  
示例二:权限测试
-  读权限 -r 
  
-  写权限 -w 
  
-  执行权限 -x 
  
1.2 整数比较
只能用于整数
#格式#
[ 整数1 操作符 整数2 ]
| 常用操作符 | 含义 | 
|---|---|
| -eq | 第一个数等于(Equal)第二个数 | 
| -ne | 第一个数不等于(Not Equal)第二个数 | 
| -gt | 第一个数大于(Greater Than)第二个数 | 
| -lt | 第一个数小于(Lesser Than)第二个数 | 
| -le | 第一个数小于或等于(Lesser or Equal)第二个数 | 
| -ge | 第一个数大于或等于(Greater or Equal)第二个数 | 
示例:磁盘已用率过高示警(不考虑光驱)
[root@byyd test]#disk=`df -h | awk '{print $5}'  | tail -n  +2  |head -n -1 | sort -rn |head -n 1| tr -d % `
//仅显示磁盘已用率,并将值赋予变量disk
[root@byyd test]#[ $disk -ge 90 ] && echo "磁盘快满了,记得清理"|| echo "能用的还有很多"
//如果大于或者等于90 则示警
//如果小于90,则提示不用清理

1.3 字符串比较
记得加空格
#格式#
[ 字符串1 = 字符串2 ] 			#判断是否相等
[ 字符串1 != 字符串2 ] 			#判断是否不等
[ -z 字符串 ]                     #判断字符串内容是否为空
| 操作符 | 含义 | 
|---|---|
| = | 字符串内容相同 | 
| != | 字符串内容不同,! 号表示相反的意思 | 
| -z | 字符串内容为空 | 
| -n | 字符是否存在 | 
示例
#一个简单的shell脚本 
#!/bin/bash
read -p "请做出你的选择:" choiceif [ $choice = "fff" ]                                                                   
then
echo "a"
else
echo "cc"
fi          

1.4 逻辑测试
#格式#
[ 表达式1 ] 操作符 [ 表达式2 ]命令1    操作符   命令2
| 操作符 | 含义 | 
|---|---|
| -a或&& | 逻辑与,全真才为真 | 
| -o | 逻辑或,一真即为真 | 
| ! | 逻辑否 | 
1.4.1 逻辑与 &&
CMD1 && CMD2     
#同时满足命令1 和命令2 的要求  才会返回正确 ,输出命令2的结果全真才为真  一假即为假      
第一个CMD1结果为真 ,第二个CMD2必须要参与运算,才能得到最终的结果第一个CMD1结果为假 ,总的结果必定为假,因此不需要执行CMD2

 
1.4.2 逻辑或 ||
CMD1 || CMD2
#命令1满足要求,直接输出命令1的结果,不需要命令2参与
#如果命令1不满足要求,命令2满足,会输出命令2的结果一真即为真
第一个CMD1结果为真 (1),总的结果必定为1,因此不需要执行CMD2
第一个CMD1结果为假 (0),第二个CMD2 必须要参与运算,才能得到最终的结果

1.4.3 组合应用
用法只有一种 cmd1 && cmd2  || cmd3   #短路与必须在短路或前

1.5 多个命令组合执行 ( ) { }
()会开启子shell{ } 不会开启子shell
( cmd1; cmd2; ... ){ cmd1; cmd2 ; cmd3 }#{}和 () 中要加空格
#多条命令要用; 隔开

二、if语句
2.1单分支结构

#单分支格式#if [  判断条件  ]
then ; echo "  "
else
echo "   "
fi
2.2 多分支结构

#多分支#if [ 判断   ]
then 
echo "  "
elif[   ] #可以无限elif 
if
...fielse #以上条件都为假
echo "   "fi
# if 和 fi要对应
2.4 if语句练习
2.4.1 单分支
#!/bin/bash# 定义一个变量
read -p "请输入你的年龄:" age  if [ $age -ge 18 ]
thenecho "你已经成年了!"
elseecho "你还未成年!"
fi

2.4.2 简单的交互式分数反馈
vim results.sh #新建脚本文件#!/bin/bash
read -p "请输入你的输入分数(0-100):" numif [ $num -ge 85 -a $num -le 100 ]
then
echo "你真厉害"
elif [ $num -ge 70 -a $num -le 84 ]
then
echo "你很棒了"
elif [ $num -ge 0 -a $num -lt 70 ]
then
echo "你仍需努力"
else
echo "你输错了,重新输"bash $0fi

三、case语句
3.1 case语句结构
#基本结构#
case 变量名 in值1)# 匹配值1时执行的代码块;;值2)# 匹配值2时执行的代码块;;值3)# 匹配值3时执行的代码块;;*)# 不匹配任何值时执行的代码块,类似于default语句;;
esac
case支持glob风格的通配符:
* 任意长度任意字符
? 任意单个字符
[0-9] 指定范围内的任意单个字符
|   或者,如: a|b
#可以用嵌套结构#
case 变量名 in值1)case 变量名 in值a)....;;值b)....;;*)....;;esac;;值2)....;;*)....;;
esac#一个case就要有一个esac对应
3.2 case语句练习
#!/bin/bash# 定义一个变量
read -p "这是什么水果:" fruitcase $fruit in"apple")echo "这是一个苹果";;"orange")echo "这是一个橘子";;"banana")echo "这是一个香蕉";;*)echo "这是其他水果";;
esac

四、echo命令详解
echo命令
echo -n   表示不换行输出
echo -e   表示输出转义符
常用的转义符
| 选项 | 作用 | 
|---|---|
| \r | 光标移至行首,并且不换行 | 
| \s | 当前shell的名称,如bash | 
| \t | 插入Tab键,制表符 | 
| \n | 输出换行 | 
| \f | 换行,但光标仍停留在原处 | 
| \ | 表示插入"\"本身转义 | 
| \b | 表示退格 不显示前一个字符 | 
| \c | 抑制更多的输出或不换行 | 
#自动磁盘分区#
#以/dev/sdb 为例
echo -e "n\n\n\n\n\nw" | fdisk /dev/sdb
